Reasoning Details

 < Module exactEval:list.
 < Prove_Constraint exactEval:host:proj_expr_unique.

Subgoal 1:

Variables: L1 L2 E2 Ty
PrA : L1 |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
PrB : L2 |{expr}- nil Ty ~~> E2
IsE : is_expr (nil Ty)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recBuild (consRecFieldExprs "null" true nilRecFieldExprs) = E2
 < case PrB.

Subgoal 1:

Variables: L1 L2 Ty
PrA : L1 |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recBuild (consRecFieldExprs "null" true nilRecFieldExprs) = recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
 < search.

Subgoal 2:

Variables: L1 L2 E2 E4 E3
PrA : L1 |{expr}- cons E3 E4 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs)))
PrB : L2 |{expr}- cons E3 E4 ~~> E2
IsE : is_expr (cons E3 E4)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) = E2
 < case PrB.

Subgoal 2:

Variables: L1 L2 E4 E3
PrA : L1 |{expr}- cons E3 E4 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs)))
IsE : is_expr (cons E3 E4)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) = recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs)))
 < search.

Subgoal 3:

Variables: L1 L2 E2 E3
PrA : L1 |{expr}- null E3 ~~> recFieldAccess E3 "null"
PrB : L2 |{expr}- null E3 ~~> E2
IsE : is_expr (null E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recFieldAccess E3 "null" = E2
 < case PrB.

Subgoal 3:

Variables: L1 L2 E3
PrA : L1 |{expr}- null E3 ~~> recFieldAccess E3 "null"
IsE : is_expr (null E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recFieldAccess E3 "null" = recFieldAccess E3 "null"
 < search.

Subgoal 4:

Variables: L1 L2 E2 E3
PrA : L1 |{expr}- head E3 ~~> recFieldAccess E3 "head"
PrB : L2 |{expr}- head E3 ~~> E2
IsE : is_expr (head E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recFieldAccess E3 "head" = E2
 < case PrB.

Subgoal 4:

Variables: L1 L2 E3
PrA : L1 |{expr}- head E3 ~~> recFieldAccess E3 "head"
IsE : is_expr (head E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recFieldAccess E3 "head" = recFieldAccess E3 "head"
 < search.

Subgoal 5:

Variables: L1 L2 E2 E3
PrA : L1 |{expr}- tail E3 ~~> recFieldAccess E3 "tail"
PrB : L2 |{expr}- tail E3 ~~> E2
IsE : is_expr (tail E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recFieldAccess E3 "tail" = E2
 < case PrB.

Subgoal 5:

Variables: L1 L2 E3
PrA : L1 |{expr}- tail E3 ~~> recFieldAccess E3 "tail"
IsE : is_expr (tail E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 recFieldAccess E3 "tail" = recFieldAccess E3 "tail"
 < search.

Subgoal 6:

Variables: L1 L2 E2 SaveL SaveI Index Lst
PrA : L1 |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
PrB : L2 |{expr}- index Lst Index ~~> E2
IsE : is_expr (index Lst Index)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" L1 SaveI
PrA2 : fresh_name "L" L1 SaveL
============================
 stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") = E2
 < PrB: case PrB.

Subgoal 6:

Variables: L1 L2 SaveL SaveI Index Lst SaveL1 SaveI1
PrA : L1 |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsE : is_expr (index Lst Index)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" L1 SaveI
PrA2 : fresh_name "L" L1 SaveL
PrB : fresh_name "I" L2 SaveI1
PrB1 : fresh_name "L" L2 SaveL1
============================
 stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") = stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head")
 < apply fresh_name_unique_mems to PrA1 PrB _ _.

Subgoal 6:

Variables: L1 L2 SaveL Index Lst SaveL1 SaveI1
PrA : L1 |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsE : is_expr (index Lst Index)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" L1 SaveI1
PrA2 : fresh_name "L" L1 SaveL
PrB : fresh_name "I" L2 SaveI1
PrB1 : fresh_name "L" L2 SaveL1
============================
 stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL) "head") = stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head")
 < apply fresh_name_unique_mems to PrA2 PrB1 _ _.

Subgoal 6:

Variables: L1 L2 Index Lst SaveL1 SaveI1
PrA : L1 |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head")
IsE : is_expr (index Lst Index)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" L1 SaveI1
PrA2 : fresh_name "L" L1 SaveL1
PrB : fresh_name "I" L2 SaveI1
PrB1 : fresh_name "L" L2 SaveL1
============================
 stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head") = stmtExpr (seq (declare intTy SaveL1 Lst) (seq (declare intTy SaveI1 Index) (seq (ifThenElse (greater (num 0) (name SaveI1)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI1) (num 0)) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign SaveI1 (minus (name SaveI1) (num 1)))))))) (recFieldAccess (name SaveL1) "head")
 < search.

Subgoal 7:

Variables: L1 L2 E2 Len SaveL E3
PrA : L1 |{expr}- exactEval:list:length E3 ~~> stmtExpr (seq (declare intTy SaveL E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
PrB : L2 |{expr}- exactEval:list:length E3 ~~> E2
IsE : is_expr (exactEval:list:length E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" L1 SaveL
PrA2 : fresh_name "Len" L1 Len
============================
 stmtExpr (seq (declare intTy SaveL E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) = E2
 < PrB: case PrB.

Subgoal 7:

Variables: L1 L2 Len SaveL E3 Len1 SaveL1
PrA : L1 |{expr}- exactEval:list:length E3 ~~> stmtExpr (seq (declare intTy SaveL E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsE : is_expr (exactEval:list:length E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" L1 SaveL
PrA2 : fresh_name "Len" L1 Len
PrB : fresh_name "L" L2 SaveL1
PrB1 : fresh_name "Len" L2 Len1
============================
 stmtExpr (seq (declare intTy SaveL E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) = stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1)
 < apply fresh_name_unique_mems to PrA1 PrB _ _.

Subgoal 7:

Variables: L1 L2 Len E3 Len1 SaveL1
PrA : L1 |{expr}- exactEval:list:length E3 ~~> stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsE : is_expr (exactEval:list:length E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" L1 SaveL1
PrA2 : fresh_name "Len" L1 Len
PrB : fresh_name "L" L2 SaveL1
PrB1 : fresh_name "Len" L2 Len1
============================
 stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) = stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1)
 < apply fresh_name_unique_mems to PrA2 PrB1 _ _.

Subgoal 7:

Variables: L1 L2 E3 Len1 SaveL1
PrA : L1 |{expr}- exactEval:list:length E3 ~~> stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1)
IsE : is_expr (exactEval:list:length E3)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" L1 SaveL1
PrA2 : fresh_name "Len" L1 Len1
PrB : fresh_name "L" L2 SaveL1
PrB1 : fresh_name "Len" L2 Len1
============================
 stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1) = stmtExpr (seq (declare intTy SaveL1 E3) (seq (declare intTy Len1 (num 0)) (while (not (recFieldAccess (name SaveL1) "null")) (seq (assign SaveL1 (recFieldAccess (name SaveL1) "tail")) (assign Len1 (plus (name Len1) (num 1))))))) (name Len1)
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_expr_is.

Subgoal 1:

Variables: L Ty
Pr : L |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsL : is_list is_string L
============================
 is_expr (recBuild (consRecFieldExprs "null" true nilRecFieldExprs))
 < case IsE.

Subgoal 1:

Variables: L Ty
Pr : L |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsL : is_list is_string L
H1 : is_typ Ty
============================
 is_expr (recBuild (consRecFieldExprs "null" true nilRecFieldExprs))
 < search 8.

Subgoal 2:

Variables: L E2 E1
Pr : L |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsE : is_expr (cons E1 E2)
IsL : is_list is_string L
============================
 is_expr (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))))
 < case IsE.

Subgoal 2:

Variables: L E2 E1
Pr : L |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsL : is_list is_string L
H1 : is_expr E1
H2 : is_expr E2
============================
 is_expr (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))))
 < search 10.

Subgoal 3:

Variables: L E1
Pr : L |{expr}- null E1 ~~> recFieldAccess E1 "null"
IsE : is_expr (null E1)
IsL : is_list is_string L
============================
 is_expr (recFieldAccess E1 "null")
 < case IsE.

Subgoal 3:

Variables: L E1
Pr : L |{expr}- null E1 ~~> recFieldAccess E1 "null"
IsL : is_list is_string L
H1 : is_expr E1
============================
 is_expr (recFieldAccess E1 "null")
 < search 7.

Subgoal 4:

Variables: L E1
Pr : L |{expr}- head E1 ~~> recFieldAccess E1 "head"
IsE : is_expr (head E1)
IsL : is_list is_string L
============================
 is_expr (recFieldAccess E1 "head")
 < case IsE.

Subgoal 4:

Variables: L E1
Pr : L |{expr}- head E1 ~~> recFieldAccess E1 "head"
IsL : is_list is_string L
H1 : is_expr E1
============================
 is_expr (recFieldAccess E1 "head")
 < search 7.

Subgoal 5:

Variables: L E1
Pr : L |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
IsE : is_expr (tail E1)
IsL : is_list is_string L
============================
 is_expr (recFieldAccess E1 "tail")
 < case IsE.

Subgoal 5:

Variables: L E1
Pr : L |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
IsL : is_list is_string L
H1 : is_expr E1
============================
 is_expr (recFieldAccess E1 "tail")
 < search 7.

Subgoal 6:

Variables: L SaveL SaveI Index Lst
Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsE : is_expr (index Lst Index)
IsL : is_list is_string L
Pr1 : fresh_name "I" L SaveI
Pr2 : fresh_name "L" L SaveL
============================
 is_expr (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"))
 < case IsE.

Subgoal 6:

Variables: L SaveL SaveI Index Lst
Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsL : is_list is_string L
Pr1 : fresh_name "I" L SaveI
Pr2 : fresh_name "L" L SaveL
H1 : is_expr Lst
H2 : is_expr Index
============================
 is_expr (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"))
 < apply fresh_name_is to _ Pr1.

Subgoal 6:

Variables: L SaveL SaveI Index Lst
Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsL : is_list is_string L
Pr1 : fresh_name "I" L SaveI
Pr2 : fresh_name "L" L SaveL
H1 : is_expr Lst
H2 : is_expr Index
H3 : is_string SaveI
============================
 is_expr (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"))
 < apply fresh_name_is to _ Pr2.

Subgoal 6:

Variables: L SaveL SaveI Index Lst
Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsL : is_list is_string L
Pr1 : fresh_name "I" L SaveI
Pr2 : fresh_name "L" L SaveL
H1 : is_expr Lst
H2 : is_expr Index
H3 : is_string SaveI
H4 : is_string SaveL
============================
 is_expr (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"))
 < search 20.

Subgoal 7:

Variables: L Len SaveL E1
Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsE : is_expr (exactEval:list:length E1)
IsL : is_list is_string L
Pr1 : fresh_name "L" L SaveL
Pr2 : fresh_name "Len" L Len
============================
 is_expr (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len))
 < case IsE.

Subgoal 7:

Variables: L Len SaveL E1
Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsL : is_list is_string L
Pr1 : fresh_name "L" L SaveL
Pr2 : fresh_name "Len" L Len
H1 : is_expr E1
============================
 is_expr (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len))
 < apply fresh_name_is to _ Pr1.

Subgoal 7:

Variables: L Len SaveL E1
Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsL : is_list is_string L
Pr1 : fresh_name "L" L SaveL
Pr2 : fresh_name "Len" L Len
H1 : is_expr E1
H2 : is_string SaveL
============================
 is_expr (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len))
 < apply fresh_name_is to _ Pr2.

Subgoal 7:

Variables: L Len SaveL E1
Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsL : is_list is_string L
Pr1 : fresh_name "L" L SaveL
Pr2 : fresh_name "Len" L Len
H1 : is_expr E1
H2 : is_string SaveL
H3 : is_string Len
============================
 is_expr (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len))
 < search 13.

Proof completed.
 < Prove_Constraint exactEval:host:proj_expr_other.

Subgoal 1:

Variables: L L' Ty
Pr : L |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsL : is_list is_string L
IsL' : is_list is_string L'
============================
 exists E'', L' |{expr}- nil Ty ~~> E''
 < search.

Subgoal 2:

Variables: L L' E2 E1
Pr : L |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsE : is_expr (cons E1 E2)
IsL : is_list is_string L
IsL' : is_list is_string L'
============================
 exists E'', L' |{expr}- cons E1 E2 ~~> E''
 < search.

Subgoal 3:

Variables: L L' E1
Pr : L |{expr}- null E1 ~~> recFieldAccess E1 "null"
IsE : is_expr (null E1)
IsL : is_list is_string L
IsL' : is_list is_string L'
============================
 exists E'', L' |{expr}- null E1 ~~> E''
 < search.

Subgoal 4:

Variables: L L' E1
Pr : L |{expr}- head E1 ~~> recFieldAccess E1 "head"
IsE : is_expr (head E1)
IsL : is_list is_string L
IsL' : is_list is_string L'
============================
 exists E'', L' |{expr}- head E1 ~~> E''
 < search.

Subgoal 5:

Variables: L L' E1
Pr : L |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
IsE : is_expr (tail E1)
IsL : is_list is_string L
IsL' : is_list is_string L'
============================
 exists E'', L' |{expr}- tail E1 ~~> E''
 < search.

Subgoal 6:

Variables: L L' SaveL SaveI Index Lst
Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsE : is_expr (index Lst Index)
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" L SaveI
Pr2 : fresh_name "L" L SaveL
============================
 exists E'', L' |{expr}- index Lst Index ~~> E''
 < apply fresh_name_exists to _ IsL' with
     Base = "I".

Subgoal 6:

Variables: L L' SaveL SaveI Index Lst F
Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsE : is_expr (index Lst Index)
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" L SaveI
Pr2 : fresh_name "L" L SaveL
H1 : fresh_name "I" L' F
============================
 exists E'', L' |{expr}- index Lst Index ~~> E''
 < apply fresh_name_exists to _ IsL' with
     Base = "L".

Subgoal 6:

Variables: L L' SaveL SaveI Index Lst F F1
Pr : L |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsE : is_expr (index Lst Index)
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" L SaveI
Pr2 : fresh_name "L" L SaveL
H1 : fresh_name "I" L' F
H2 : fresh_name "L" L' F1
============================
 exists E'', L' |{expr}- index Lst Index ~~> E''
 < search.

Subgoal 7:

Variables: L L' Len SaveL E1
Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsE : is_expr (exactEval:list:length E1)
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "L" L SaveL
Pr2 : fresh_name "Len" L Len
============================
 exists E'', L' |{expr}- exactEval:list:length E1 ~~> E''
 < apply fresh_name_exists to _ IsL' with
     Base = "L".

Subgoal 7:

Variables: L L' Len SaveL E1 F
Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsE : is_expr (exactEval:list:length E1)
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "L" L SaveL
Pr2 : fresh_name "Len" L Len
H1 : fresh_name "L" L' F
============================
 exists E'', L' |{expr}- exactEval:list:length E1 ~~> E''
 < apply fresh_name_exists to _ IsL' with
     Base = "Len".

Subgoal 7:

Variables: L L' Len SaveL E1 F F1
Pr : L |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsE : is_expr (exactEval:list:length E1)
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "L" L SaveL
Pr2 : fresh_name "Len" L Len
H1 : fresh_name "L" L' F
H2 : fresh_name "Len" L' F1
============================
 exists E'', L' |{expr}- exactEval:list:length E1 ~~> E''
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmt_unique.

Subgoal 1:

Variables: L1 L2 S2 Hold Copy L SaveE SaveI E I
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
PrB : L2 |{stmt}- listUpdate L I E ~~> S2
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
============================
 scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = S2
 < PrB: case PrB.

Subgoal 1:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
============================
 scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
 < assert forall X,
     mem X (L::L2) -> mem X (L::L1).

Subgoal 1.1:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
============================
 forall X, mem X (L::L2) -> mem X (L::L1)
 < intros M.

Subgoal 1.1:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
M : mem X (L::L2)
============================
 mem X (L::L1)
 < M: case M.

Subgoal 1.1.1:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
============================
 mem L (L::L1)
 < search.

Subgoal 1.1.2:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
M : mem X L2
============================
 mem X (L::L1)
 < apply Rel21 to M.

Subgoal 1.1.2:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
M : mem X L2
H1 : mem X L1
============================
 mem X (L::L1)
 < search.

Subgoal 1:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
============================
 scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
 < assert forall X,
     mem X (L::L1) -> mem X (L::L2).

Subgoal 1.2:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
============================
 forall X, mem X (L::L1) -> mem X (L::L2)
 < intros M.

Subgoal 1.2:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
M : mem X (L::L1)
============================
 mem X (L::L2)
 < M: case M.

Subgoal 1.2.1:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
============================
 mem L (L::L2)
 < search.

Subgoal 1.2.2:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
M : mem X L1
============================
 mem X (L::L2)
 < apply Rel12 to M.

Subgoal 1.2.2:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1 X
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
M : mem X L1
H2 : mem X L2
============================
 mem X (L::L2)
 < search.

Subgoal 1:

Variables: L1 L2 Hold Copy L SaveE SaveI E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
H2 : forall X, mem X (L::L1) -> mem X (L::L2)
============================
 scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
 < apply fresh_name_unique_mems to PrA1 PrB _ _.

Subgoal 1:

Variables: L1 L2 Hold Copy L SaveE E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI1
PrA2 : fresh_name "Hold" (L::L1) Hold
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
H2 : forall X, mem X (L::L1) -> mem X (L::L2)
============================
 scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
 < apply fresh_name_unique_mems to PrA2 PrB1 _ _.

Subgoal 1:

Variables: L1 L2 Copy L SaveE E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold1))) (seq (declare intTy Copy (name Hold1)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold1 (tail (name Hold1))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI1
PrA2 : fresh_name "Hold" (L::L1) Hold1
PrA3 : fresh_name "E" (L::L1) SaveE
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
H2 : forall X, mem X (L::L1) -> mem X (L::L2)
============================
 scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold1))) (seq (declare intTy Copy (name Hold1)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold1 (tail (name Hold1)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
 < apply fresh_name_unique_mems to PrA3 PrB2 _ _.

Subgoal 1:

Variables: L1 L2 Copy L E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy (name Hold1)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold1 (tail (name Hold1))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI1
PrA2 : fresh_name "Hold" (L::L1) Hold1
PrA3 : fresh_name "E" (L::L1) SaveE1
PrA4 : fresh_name "C" (L::L1) Copy
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
H2 : forall X, mem X (L::L1) -> mem X (L::L2)
============================
 scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy (name Hold1)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold1 (tail (name Hold1)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
 < apply fresh_name_unique_mems to PrA4 PrB3 _ _.

Subgoal 1:

Variables: L1 L2 L E I Hold1 Copy1 SaveE1 SaveI1
PrA : L1 |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "I" (L::L1) SaveI1
PrA2 : fresh_name "Hold" (L::L1) Hold1
PrA3 : fresh_name "E" (L::L1) SaveE1
PrA4 : fresh_name "C" (L::L1) Copy1
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
PrB3 : fresh_name "C" (L::L2) Copy1
H1 : forall X, mem X (L::L2) -> mem X (L::L1)
H2 : forall X, mem X (L::L1) -> mem X (L::L2)
============================
 scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1)))))))))))))) = scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (and (not (eq (name SaveI1) (num 0))) (not (null (name L)))) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (declare intTy Copy1 (name L)) (seq (recUpdate Copy1 ["tail"] (name Hold1)) (seq (assign Hold1 (name Copy1)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy1 (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE1)) (while (not (null (name Hold1))) (seq (declare intTy Copy1 (name Hold1)) (seq (recUpdate Copy1 ["tail"] (name L)) (seq (assign L (name Copy1)) (assign Hold1 (tail (name Hold1))))))))))))))
 < search.

Subgoal 2:

Variables: L1 L2 S2 Body SaveL X L
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
PrB : L2 |{stmt}- listForeach X L Body ~~> S2
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
============================
 scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) = S2
 < PrB: case PrB.

Subgoal 2:

Variables: L1 L2 Body SaveL X L SaveL1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
============================
 scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) = scopeStmt (seq (declare intTy SaveL1 L) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))))
 < apply fresh_name_unique_mems to PrA1 PrB _ _.

Subgoal 2.1:

Variables: L1 L2 Body SaveL X L SaveL1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
============================
 forall X1, mem X1 (X::L2) -> mem X1 (X::L1)
 < intros M.

Subgoal 2.1:

Variables: L1 L2 Body SaveL X L SaveL1 X1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
M : mem X1 (X::L2)
============================
 mem X1 (X::L1)
 < M: case M.

Subgoal 2.1.1:

Variables: L1 L2 Body SaveL X L SaveL1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
============================
 mem X (X::L1)
 < search.

Subgoal 2.1.2:

Variables: L1 L2 Body SaveL X L SaveL1 X1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
M : mem X1 L2
============================
 mem X1 (X::L1)
 < apply Rel21 to M.

Subgoal 2.1.2:

Variables: L1 L2 Body SaveL X L SaveL1 X1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
M : mem X1 L2
H1 : mem X1 L1
============================
 mem X1 (X::L1)
 < search.

Subgoal 2.2:

Variables: L1 L2 Body SaveL X L SaveL1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
============================
 forall X1, mem X1 (X::L1) -> mem X1 (X::L2)
 < intros M.

Subgoal 2.2:

Variables: L1 L2 Body SaveL X L SaveL1 X1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
M : mem X1 (X::L1)
============================
 mem X1 (X::L2)
 < M: case M.

Subgoal 2.2.1:

Variables: L1 L2 Body SaveL X L SaveL1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
============================
 mem X (X::L2)
 < search.

Subgoal 2.2.2:

Variables: L1 L2 Body SaveL X L SaveL1 X1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
M : mem X1 L1
============================
 mem X1 (X::L2)
 < apply Rel12 to M.

Subgoal 2.2.2:

Variables: L1 L2 Body SaveL X L SaveL1 X1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL
PrB : fresh_name "L" (X::L2) SaveL1
M : mem X1 L1
H1 : mem X1 L2
============================
 mem X1 (X::L2)
 < search.

Subgoal 2:

Variables: L1 L2 Body X L SaveL1
PrA : L1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL1 L) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))))
IsS : is_stmt (listForeach X L Body)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
PrA1 : fresh_name "L" (X::L1) SaveL1
PrB : fresh_name "L" (X::L2) SaveL1
============================
 scopeStmt (seq (declare intTy SaveL1 L) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body)))) = scopeStmt (seq (declare intTy SaveL1 L) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))))
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmt_is.

Subgoal 1:

Variables: L Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L1 I E)
IsL : is_list is_string L
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
============================
 is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
 < case IsS.

Subgoal 1:

Variables: L Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
============================
 is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
 < apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: L Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
============================
 is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
 < assert is_string "Hold".

Subgoal 1.1:

Variables: L Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: L Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string "Hold"
============================
 is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
 < apply fresh_name_is to _ Pr2.

Subgoal 1:

Variables: L Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string "Hold"
H6 : is_string Hold
============================
 is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
 < apply fresh_name_is to _ Pr3.

Subgoal 1:

Variables: L Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string "Hold"
H6 : is_string Hold
H7 : is_string SaveE
============================
 is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
 < apply fresh_name_is to _ Pr4.

Subgoal 1:

Variables: L Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string "Hold"
H6 : is_string Hold
H7 : is_string SaveE
H8 : is_string Copy
============================
 is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
 < search 30.

Subgoal 2:

Variables: L Body SaveL X L1
Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L1 Body)
IsL : is_list is_string L
Pr1 : fresh_name "L" (X::L) SaveL
============================
 is_stmt (scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))))
 < case IsS.

Subgoal 2:

Variables: L Body SaveL X L1
Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsL : is_list is_string L
Pr1 : fresh_name "L" (X::L) SaveL
H1 : is_string X
H2 : is_expr L1
H3 : is_stmt Body
============================
 is_stmt (scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))))
 < apply fresh_name_is to _ Pr1.

Subgoal 2:

Variables: L Body SaveL X L1
Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsL : is_list is_string L
Pr1 : fresh_name "L" (X::L) SaveL
H1 : is_string X
H2 : is_expr L1
H3 : is_stmt Body
H4 : is_string SaveL
============================
 is_stmt (scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))))
 < search 20.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmt_other.

Subgoal 1:

Variables: L L' Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L1 I E)
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < case IsS.

Subgoal 1:

Variables: L L' Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < Is': assert is_list is_string (L1::L').

Subgoal 1:

Variables: L L' Hold Copy L1 SaveE SaveI E I
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
Is' : is_list is_string (L1::L')
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < apply fresh_name_exists to _ Is' with
     Base = "I".

Subgoal 1:

Variables: L L' Hold Copy L1 SaveE SaveI E I F
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
Is' : is_list is_string (L1::L')
H4 : fresh_name "I" (L1::L') F
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < apply fresh_name_exists to _ Is' with
     Base = "Hold".

Subgoal 1.1:

Variables: L L' Hold Copy L1 SaveE SaveI E I F
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
Is' : is_list is_string (L1::L')
H4 : fresh_name "I" (L1::L') F
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: L L' Hold Copy L1 SaveE SaveI E I F F1
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
Is' : is_list is_string (L1::L')
H4 : fresh_name "I" (L1::L') F
H5 : fresh_name "Hold" (L1::L') F1
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < apply fresh_name_exists to _ Is' with
     Base = "E".

Subgoal 1:

Variables: L L' Hold Copy L1 SaveE SaveI E I F F1 F2
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
Is' : is_list is_string (L1::L')
H4 : fresh_name "I" (L1::L') F
H5 : fresh_name "Hold" (L1::L') F1
H6 : fresh_name "E" (L1::L') F2
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < apply fresh_name_exists to _ Is' with
     Base = "C".

Subgoal 1:

Variables: L L' Hold Copy L1 SaveE SaveI E I F F1 F2 F3
Pr : L |{stmt}- listUpdate L1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L1 (tail (name L1)))))))) (seq (ifThenElse (null (name L1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L1)) (seq (assign L1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "I" (L1::L) SaveI
Pr2 : fresh_name "Hold" (L1::L) Hold
Pr3 : fresh_name "E" (L1::L) SaveE
Pr4 : fresh_name "C" (L1::L) Copy
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
Is' : is_list is_string (L1::L')
H4 : fresh_name "I" (L1::L') F
H5 : fresh_name "Hold" (L1::L') F1
H6 : fresh_name "E" (L1::L') F2
H7 : fresh_name "C" (L1::L') F3
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < search.

Subgoal 2:

Variables: L L' Body SaveL X L1
Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X L1 Body)
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "L" (X::L) SaveL
============================
 exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
 < case IsS.

Subgoal 2:

Variables: L L' Body SaveL X L1
Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "L" (X::L) SaveL
H1 : is_string X
H2 : is_expr L1
H3 : is_stmt Body
============================
 exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
 < Is': assert is_list is_string (X::L').

Subgoal 2:

Variables: L L' Body SaveL X L1
Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "L" (X::L) SaveL
H1 : is_string X
H2 : is_expr L1
H3 : is_stmt Body
Is' : is_list is_string (X::L')
============================
 exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
 < apply fresh_name_exists to _ Is' with
     Base = "L".

Subgoal 2:

Variables: L L' Body SaveL X L1 F
Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsL : is_list is_string L
IsL' : is_list is_string L'
Pr1 : fresh_name "L" (X::L) SaveL
H1 : is_string X
H2 : is_expr L1
H3 : is_stmt Body
Is' : is_list is_string (X::L')
H4 : fresh_name "L" (X::L') F
============================
 exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_fun_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_fun_is.

Proof completed.
 < Prove_Constraint exactEval:host:proj_param_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_param_is.

Proof completed.
 < Prove_Constraint exactEval:host:proj_program_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_program_is.

Proof completed.
 < Prove_Constraint exactEval:host:proj_typ_unique.

Variables: T2 T3
PrA : |{typ}- listTy T3 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys)))
PrB : |{typ}- listTy T3 ~~> T2
IsT : is_typ (listTy T3)
============================
 recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) = T2
 < case PrB.

Variables: T3
PrA : |{typ}- listTy T3 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys)))
IsT : is_typ (listTy T3)
============================
 recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) = recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys)))
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_typ_is.

Variables: T1
Pr : |{typ}- listTy T1 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys)))
IsT : is_typ (listTy T1)
============================
 is_typ (recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))))
 < case IsT.

Variables: T1
Pr : |{typ}- listTy T1 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys)))
H1 : is_typ T1
============================
 is_typ (recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))))
 < search 11.

Proof completed.
 < Add_Proj_Rel exactEval:host:is_expr,
   exactEval:host:is_args,
   exactEval:host:is_recFieldExprs,
   exactEval:host:is_stmt.

Proof completed.
 < Prove_Ext_Ind exactEval:host:is_expr,
   exactEval:host:is_args,
   exactEval:host:is_recFieldExprs,
   exactEval:host:is_stmt.

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

Variables: Typ
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (nil Typ) @
R1 : is_typ Typ
============================
 <is_expr {P}> (nil Typ)
 < search 10.

Subgoal 1.22:

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (cons Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
============================
 <is_expr {P}> (cons Expr1 Expr)
 < apply IH to R1.

Subgoal 1.22:

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (cons Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
H1 : <is_expr {P}> Expr1
============================
 <is_expr {P}> (cons Expr1 Expr)
 < apply IH to R2.

Subgoal 1.22:

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (cons Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
============================
 <is_expr {P}> (cons Expr1 Expr)
 < search 20.

Subgoal 1.23:

Variables: Expr
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (head Expr) @
R1 : is_expr Expr *
============================
 <is_expr {P}> (head Expr)
 < apply IH to R1.

Subgoal 1.23:

Variables: Expr
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (head Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
============================
 <is_expr {P}> (head Expr)
 < search 10.

Subgoal 1.24:

Variables: Expr
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (tail Expr) @
R1 : is_expr Expr *
============================
 <is_expr {P}> (tail Expr)
 < apply IH to R1.

Subgoal 1.24:

Variables: Expr
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (tail Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
============================
 <is_expr {P}> (tail Expr)
 < search 10.

Subgoal 1.25:

Variables: Expr
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (null Expr) @
R1 : is_expr Expr *
============================
 <is_expr {P}> (null Expr)
 < apply IH to R1.

Subgoal 1.25:

Variables: Expr
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (null Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
============================
 <is_expr {P}> (null Expr)
 < search 10.

Subgoal 1.26:

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (index Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
============================
 <is_expr {P}> (index Expr1 Expr)
 < apply IH to R1.

Subgoal 1.26:

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (index Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
H1 : <is_expr {P}> Expr1
============================
 <is_expr {P}> (index Expr1 Expr)
 < apply IH to R2.

Subgoal 1.26:

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (index Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
============================
 <is_expr {P}> (index Expr1 Expr)
 < apply fresh_name_exists to _ _ with
     Base = "I" Names = [].

Subgoal 1.26:

Variables: Expr Expr1 F
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (index Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
H3 : fresh_name "I" [] F
============================
 <is_expr {P}> (index Expr1 Expr)
 < apply fresh_name_exists to _ _ with
     Base = "L" Names = [].

Subgoal 1.26:

Variables: Expr Expr1 F F1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (index Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
H3 : fresh_name "I" [] F
H4 : fresh_name "L" [] F1
============================
 <is_expr {P}> (index Expr1 Expr)
 < search 20.

Subgoal 1.27:

Variables: Expr
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (exactEval:list:length Expr) @
R1 : is_expr Expr *
============================
 <is_expr {P}> (exactEval:list:length Expr)
 < apply IH to R1.

Subgoal 1.27:

Variables: Expr
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (exactEval:list:length Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
============================
 <is_expr {P}> (exactEval:list:length Expr)
 < apply fresh_name_exists to _ _ with
     Base = "L" Names = [].

Subgoal 1.27:

Variables: Expr F
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (exactEval:list:length Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
H2 : fresh_name "L" [] F
============================
 <is_expr {P}> (exactEval:list:length Expr)
 < apply fresh_name_exists to _ _ with
     Base = "Len" Names = [].

Subgoal 1.27:

Variables: Expr F F1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_expr (exactEval:list:length Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
H2 : fresh_name "L" [] F
H3 : fresh_name "Len" [] F1
============================
 <is_expr {P}> (exactEval:list:length Expr)
 < search 20.

Subgoal 4.10:

Variables: Expr Expr1 S1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < apply IH to R2.

Subgoal 4.10:

Variables: Expr Expr1 S1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < apply IH to R3.

Subgoal 4.10:

Variables: Expr Expr1 S1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < FrI: apply fresh_name_exists to _ _ with
          Base = "I" Names = [S1].

Subgoal 4.10:

Variables: Expr Expr1 S1 F
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] F
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < FrH: apply fresh_name_exists to _ _ with
          Base = "Hold" Names = [S1].

Subgoal 4.10.1:

Variables: Expr Expr1 S1 F
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] F
============================
 is_string "Hold"
 < search 7.

Subgoal 4.10:

Variables: Expr Expr1 S1 F F1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] F
FrH : fresh_name "Hold" [S1] F1
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < FrE: apply fresh_name_exists to _ _ with
          Base = "E" Names = [S1].

Subgoal 4.10:

Variables: Expr Expr1 S1 F F1 F2
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] F
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < FrC: apply fresh_name_exists to _ _ with
          Base = "C" Names = [S1].

Subgoal 4.10:

Variables: Expr Expr1 S1 F F1 F2 F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] F
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
FrC : fresh_name "C" [S1] F3
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < apply fresh_name_is to _ FrI.

Subgoal 4.10:

Variables: Expr Expr1 S1 F F1 F2 F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] F
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
FrC : fresh_name "C" [S1] F3
H3 : is_string F
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < rename F to SaveI.

Subgoal 4.10:

Variables: Expr Expr1 S1 SaveI F1 F2 F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
FrC : fresh_name "C" [S1] F3
H3 : is_string SaveI
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < apply fresh_name_is to _ FrH.

Subgoal 4.10.2:

Variables: Expr Expr1 S1 SaveI F1 F2 F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
FrC : fresh_name "C" [S1] F3
H3 : is_string SaveI
============================
 is_string "Hold"
 < search 7.

Subgoal 4.10:

Variables: Expr Expr1 S1 SaveI F1 F2 F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
FrC : fresh_name "C" [S1] F3
H3 : is_string SaveI
H4 : is_string F1
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < rename F1 to Hold.

Subgoal 4.10:

Variables: Expr Expr1 S1 SaveI Hold F2 F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] F2
FrC : fresh_name "C" [S1] F3
H3 : is_string SaveI
H4 : is_string Hold
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < apply fresh_name_is to _ FrE.

Subgoal 4.10:

Variables: Expr Expr1 S1 SaveI Hold F2 F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] F2
FrC : fresh_name "C" [S1] F3
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string F2
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < rename F2 to SaveE.

Subgoal 4.10:

Variables: Expr Expr1 S1 SaveI Hold SaveE F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] F3
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < apply fresh_name_is to _ FrC.

Subgoal 4.10:

Variables: Expr Expr1 S1 SaveI Hold SaveE F3
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] F3
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string F3
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < rename F3 to Copy.

Subgoal 4.10:

Variables: Expr Expr1 S1 SaveI Hold SaveE Copy
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 Expr1 Expr) @
R1 : is_string S1
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < rename Expr1 to I.

Subgoal 4.10:

Variables: Expr I S1 SaveI Hold SaveE Copy
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I Expr) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr Expr *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> Expr
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
============================
 <is_stmt {P}> (listUpdate S1 I Expr)
 < rename Expr to E.

Subgoal 4.10:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
============================
 <is_stmt {P}> (listUpdate S1 I E)
 < assert [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (exactEval:list:nil intTy)) (seq (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))).

Subgoal 4.10:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
============================
 <is_stmt {P}> (listUpdate S1 I E)
 < unfold .

Subgoal 4.10:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
============================
 exists A1 X_T,
   (is_string S1 /\ (<is_expr {P}> I /\ <is_expr {P}> E)) /\
   (A1 |{stmt}- listUpdate S1 I E ~~> X_T /\ <is_stmt {P}> X_T)
 < exists [],
   scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (exactEval:list:nil intTy)) (seq (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))).

Subgoal 4.10:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
============================
 (is_string S1 /\ (<is_expr {P}> I /\ <is_expr {P}> E)) /\
 ([] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))) /\
 <is_stmt {P}> (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))))
 < split.

Subgoal 4.10.3:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
============================
 is_string S1
 < search.

Subgoal 4.10.4:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
============================
 <is_expr {P}> I
 < search.

Subgoal 4.10.5:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
============================
 <is_expr {P}> E
 < search.

Subgoal 4.10.6:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
============================
 [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
 < search.

Subgoal 4.10.7:

Variables: E I S1 SaveI Hold SaveE Copy
IH : forall E1, is_expr E1 * -> <is_expr {P}> E1
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listUpdate S1 I E) @
R1 : is_string S1
R2 : is_expr I *
R3 : is_expr E *
H1 : <is_expr {P}> I
H2 : <is_expr {P}> E
FrI : fresh_name "I" [S1] SaveI
FrH : fresh_name "Hold" [S1] Hold
FrE : fresh_name "E" [S1] SaveE
FrC : fresh_name "C" [S1] Copy
H3 : is_string SaveI
H4 : is_string Hold
H5 : is_string SaveE
H6 : is_string Copy
H7 : [] |{stmt}- listUpdate S1 I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold))))))))))))))
============================
 <is_stmt {P}> (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name S1)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name S1)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign S1 (tail (name S1)))))))) (seq (ifThenElse (null (name S1)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate S1 ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name S1)) (seq (assign S1 (name Copy)) (assign Hold (tail (name Hold)))))))))))))))
 < search 30.

Subgoal 4.11:

Variables: Stmt Expr S1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listForeach S1 Expr Stmt) @
R1 : is_string S1
R2 : is_expr Expr *
R3 : is_stmt Stmt *
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < apply IH to R2.

Subgoal 4.11:

Variables: Stmt Expr S1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listForeach S1 Expr Stmt) @
R1 : is_string S1
R2 : is_expr Expr *
R3 : is_stmt Stmt *
H1 : <is_expr {P}> Expr
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < apply IH3 to R3.

Subgoal 4.11:

Variables: Stmt Expr S1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listForeach S1 Expr Stmt) @
R1 : is_string S1
R2 : is_expr Expr *
R3 : is_stmt Stmt *
H1 : <is_expr {P}> Expr
H2 : <is_stmt {P}> Stmt
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < Fr: apply fresh_name_exists to _ _ with
         Base = "L" Names = [S1].

Subgoal 4.11:

Variables: Stmt Expr S1 F
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listForeach S1 Expr Stmt) @
R1 : is_string S1
R2 : is_expr Expr *
R3 : is_stmt Stmt *
H1 : <is_expr {P}> Expr
H2 : <is_stmt {P}> Stmt
Fr : fresh_name "L" [S1] F
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < apply fresh_name_is to _ Fr.

Subgoal 4.11:

Variables: Stmt Expr S1 F
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (listForeach S1 Expr Stmt) @
R1 : is_string S1
R2 : is_expr Expr *
R3 : is_stmt Stmt *
H1 : <is_expr {P}> Expr
H2 : <is_stmt {P}> Stmt
Fr : fresh_name "L" [S1] F
H3 : is_string F
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < search 20.

Proof completed.
 < Prove exactEval:host:is_args_nilArgs_or_consArgs.

Proof completed.
 < Prove exactEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs.

Proof completed.
 < Prove exactEval:host:vars_unique.

Subgoal 1.21:

Variables: V2 Ty
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (nil Ty)
VarsA : vars (nil Ty) [] @
VarsB : vars (nil Ty) V2
============================
 [] = V2
 < case VarsB.

Subgoal 1.21:

Variables: Ty
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (nil Ty)
VarsA : vars (nil Ty) [] @
============================
 [] = []
 < search.

Subgoal 1.22:

Variables: V1 V2 V3 V4 E2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (cons E1 E2)
VarsA : vars (cons E1 E2) V1 @
VarsB : vars (cons E1 E2) V2
VarsA1 : vars E1 V3 *
VarsA2 : vars E2 V4 *
VarsA3 : V3 ++ V4 = V1
============================
 V1 = V2
 < case IsE.

Subgoal 1.22:

Variables: V1 V2 V3 V4 E2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (cons E1 E2) V1 @
VarsB : vars (cons E1 E2) V2
VarsA1 : vars E1 V3 *
VarsA2 : vars E2 V4 *
VarsA3 : V3 ++ V4 = V1
H1 : is_expr E1
H2 : is_expr E2
============================
 V1 = V2
 < VarsB: case VarsB.

Subgoal 1.22:

Variables: V1 V2 V3 V4 E2 E1 V5 V6
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (cons E1 E2) V1 @
VarsA1 : vars E1 V3 *
VarsA2 : vars E2 V4 *
VarsA3 : V3 ++ V4 = V1
H1 : is_expr E1
H2 : is_expr E2
VarsB : vars E1 V5
VarsB1 : vars E2 V6
VarsB2 : V5 ++ V6 = V2
============================
 V1 = V2
 < apply IH to _ VarsA1 VarsB.

Subgoal 1.22:

Variables: V1 V2 V4 E2 E1 V5 V6
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (cons E1 E2) V1 @
VarsA1 : vars E1 V5 *
VarsA2 : vars E2 V4 *
VarsA3 : V5 ++ V4 = V1
H1 : is_expr E1
H2 : is_expr E2
VarsB : vars E1 V5
VarsB1 : vars E2 V6
VarsB2 : V5 ++ V6 = V2
============================
 V1 = V2
 < apply IH to _ VarsA2 VarsB1.

Subgoal 1.22:

Variables: V1 V2 E2 E1 V5 V6
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (cons E1 E2) V1 @
VarsA1 : vars E1 V5 *
VarsA2 : vars E2 V6 *
VarsA3 : V5 ++ V6 = V1
H1 : is_expr E1
H2 : is_expr E2
VarsB : vars E1 V5
VarsB1 : vars E2 V6
VarsB2 : V5 ++ V6 = V2
============================
 V1 = V2
 < apply append_unique to VarsA3 VarsB2.

Subgoal 1.22:

Variables: V2 E2 E1 V5 V6
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (cons E1 E2) V2 @
VarsA1 : vars E1 V5 *
VarsA2 : vars E2 V6 *
VarsA3 : V5 ++ V6 = V2
H1 : is_expr E1
H2 : is_expr E2
VarsB : vars E1 V5
VarsB1 : vars E2 V6
VarsB2 : V5 ++ V6 = V2
============================
 V2 = V2
 < search.

Subgoal 1.23:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (head E1)
VarsA : vars (head E1) V1 @
VarsB : vars (head E1) V2
VarsA1 : vars E1 V1 *
============================
 V1 = V2
 < case IsE.

Subgoal 1.23:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (head E1) V1 @
VarsB : vars (head E1) V2
VarsA1 : vars E1 V1 *
H1 : is_expr E1
============================
 V1 = V2
 < VarsB: case VarsB.

Subgoal 1.23:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (head E1) V1 @
VarsA1 : vars E1 V1 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V1 = V2
 < apply IH to _ VarsA1 VarsB.

Subgoal 1.23:

Variables: V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (head E1) V2 @
VarsA1 : vars E1 V2 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V2 = V2
 < search.

Subgoal 1.24:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (tail E1)
VarsA : vars (tail E1) V1 @
VarsB : vars (tail E1) V2
VarsA1 : vars E1 V1 *
============================
 V1 = V2
 < case IsE.

Subgoal 1.24:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (tail E1) V1 @
VarsB : vars (tail E1) V2
VarsA1 : vars E1 V1 *
H1 : is_expr E1
============================
 V1 = V2
 < VarsB: case VarsB.

Subgoal 1.24:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (tail E1) V1 @
VarsA1 : vars E1 V1 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V1 = V2
 < apply IH to _ VarsA1 VarsB.

Subgoal 1.24:

Variables: V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (tail E1) V2 @
VarsA1 : vars E1 V2 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V2 = V2
 < search.

Subgoal 1.25:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (null E1)
VarsA : vars (null E1) V1 @
VarsB : vars (null E1) V2
VarsA1 : vars E1 V1 *
============================
 V1 = V2
 < case IsE.

Subgoal 1.25:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (null E1) V1 @
VarsB : vars (null E1) V2
VarsA1 : vars E1 V1 *
H1 : is_expr E1
============================
 V1 = V2
 < VarsB: case VarsB.

Subgoal 1.25:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (null E1) V1 @
VarsA1 : vars E1 V1 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V1 = V2
 < apply IH to _ VarsA1 VarsB.

Subgoal 1.25:

Variables: V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (null E1) V2 @
VarsA1 : vars E1 V2 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V2 = V2
 < search.

Subgoal 1.26:

Variables: V1 V2 VL VI I L
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (index L I)
VarsA : vars (index L I) V1 @
VarsB : vars (index L I) V2
VarsA1 : vars L VL *
VarsA2 : vars I VI *
VarsA3 : VL ++ VI = V1
============================
 V1 = V2
 < case IsE.

Subgoal 1.26:

Variables: V1 V2 VL VI I L
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (index L I) V1 @
VarsB : vars (index L I) V2
VarsA1 : vars L VL *
VarsA2 : vars I VI *
VarsA3 : VL ++ VI = V1
H1 : is_expr L
H2 : is_expr I
============================
 V1 = V2
 < VarsB: case VarsB.

Subgoal 1.26:

Variables: V1 V2 VL VI I L VL1 VI1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (index L I) V1 @
VarsA1 : vars L VL *
VarsA2 : vars I VI *
VarsA3 : VL ++ VI = V1
H1 : is_expr L
H2 : is_expr I
VarsB : vars L VL1
VarsB1 : vars I VI1
VarsB2 : VL1 ++ VI1 = V2
============================
 V1 = V2
 < apply IH to _ VarsA1 VarsB.

Subgoal 1.26:

Variables: V1 V2 VI I L VL1 VI1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (index L I) V1 @
VarsA1 : vars L VL1 *
VarsA2 : vars I VI *
VarsA3 : VL1 ++ VI = V1
H1 : is_expr L
H2 : is_expr I
VarsB : vars L VL1
VarsB1 : vars I VI1
VarsB2 : VL1 ++ VI1 = V2
============================
 V1 = V2
 < apply IH to _ VarsA2 VarsB1.

Subgoal 1.26:

Variables: V1 V2 I L VL1 VI1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (index L I) V1 @
VarsA1 : vars L VL1 *
VarsA2 : vars I VI1 *
VarsA3 : VL1 ++ VI1 = V1
H1 : is_expr L
H2 : is_expr I
VarsB : vars L VL1
VarsB1 : vars I VI1
VarsB2 : VL1 ++ VI1 = V2
============================
 V1 = V2
 < apply append_unique to VarsA3 VarsB2.

Subgoal 1.26:

Variables: V2 I L VL1 VI1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (index L I) V2 @
VarsA1 : vars L VL1 *
VarsA2 : vars I VI1 *
VarsA3 : VL1 ++ VI1 = V2
H1 : is_expr L
H2 : is_expr I
VarsB : vars L VL1
VarsB1 : vars I VI1
VarsB2 : VL1 ++ VI1 = V2
============================
 V2 = V2
 < search.

Subgoal 1.27:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (exactEval:list:length E1)
VarsA : vars (exactEval:list:length E1) V1 @
VarsB : vars (exactEval:list:length E1) V2
VarsA1 : vars E1 V1 *
============================
 V1 = V2
 < case IsE.

Subgoal 1.27:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (exactEval:list:length E1) V1 @
VarsB : vars (exactEval:list:length E1) V2
VarsA1 : vars E1 V1 *
H1 : is_expr E1
============================
 V1 = V2
 < VarsB: case VarsB.

Subgoal 1.27:

Variables: V1 V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (exactEval:list:length E1) V1 @
VarsA1 : vars E1 V1 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V1 = V2
 < apply IH to _ VarsA1 VarsB.

Subgoal 1.27:

Variables: V2 E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
        is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (exactEval:list:length E1) V2 @
VarsA1 : vars E1 V2 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V2 = V2
 < search.

Proof completed.
 < Prove exactEval:host:vars_is.

Subgoal 1.21:

Variables: Ty
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
IsE : is_expr (nil Ty)
V : vars (nil Ty) [] @
============================
 is_list is_string []
 < search.

Subgoal 1.22:

Variables: V V2 V3 E2 E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
IsE : is_expr (cons E1 E2)
V : vars (cons E1 E2) V @
V1 : vars E1 V2 *
V2 : vars E2 V3 *
V3 : V2 ++ V3 = V
============================
 is_list is_string V
 < case IsE.

Subgoal 1.22:

Variables: V V2 V3 E2 E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (cons E1 E2) V @
V1 : vars E1 V2 *
V2 : vars E2 V3 *
V3 : V2 ++ V3 = V
H1 : is_expr E1
H2 : is_expr E2
============================
 is_list is_string V
 < apply IH to _ V1.

Subgoal 1.22:

Variables: V V2 V3 E2 E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (cons E1 E2) V @
V1 : vars E1 V2 *
V2 : vars E2 V3 *
V3 : V2 ++ V3 = V
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string V2
============================
 is_list is_string V
 < apply IH to _ V2.

Subgoal 1.22:

Variables: V V2 V3 E2 E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (cons E1 E2) V @
V1 : vars E1 V2 *
V2 : vars E2 V3 *
V3 : V2 ++ V3 = V
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string V2
H4 : is_list is_string V3
============================
 is_list is_string V
 < apply append_list_string_is to _ _ V3.

Subgoal 1.22:

Variables: V V2 V3 E2 E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (cons E1 E2) V @
V1 : vars E1 V2 *
V2 : vars E2 V3 *
V3 : V2 ++ V3 = V
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string V2
H4 : is_list is_string V3
H5 : is_list is_string V
============================
 is_list is_string V
 < search.

Subgoal 1.23:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
IsE : is_expr (head E1)
V : vars (head E1) V @
V1 : vars E1 V *
============================
 is_list is_string V
 < case IsE.

Subgoal 1.23:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (head E1) V @
V1 : vars E1 V *
H1 : is_expr E1
============================
 is_list is_string V
 < apply IH to _ V1.

Subgoal 1.23:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (head E1) V @
V1 : vars E1 V *
H1 : is_expr E1
H2 : is_list is_string V
============================
 is_list is_string V
 < search.

Subgoal 1.24:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
IsE : is_expr (tail E1)
V : vars (tail E1) V @
V1 : vars E1 V *
============================
 is_list is_string V
 < case IsE.

Subgoal 1.24:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (tail E1) V @
V1 : vars E1 V *
H1 : is_expr E1
============================
 is_list is_string V
 < apply IH to _ V1.

Subgoal 1.24:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (tail E1) V @
V1 : vars E1 V *
H1 : is_expr E1
H2 : is_list is_string V
============================
 is_list is_string V
 < search.

Subgoal 1.25:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
IsE : is_expr (null E1)
V : vars (null E1) V @
V1 : vars E1 V *
============================
 is_list is_string V
 < case IsE.

Subgoal 1.25:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (null E1) V @
V1 : vars E1 V *
H1 : is_expr E1
============================
 is_list is_string V
 < apply IH to _ V1.

Subgoal 1.25:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (null E1) V @
V1 : vars E1 V *
H1 : is_expr E1
H2 : is_list is_string V
============================
 is_list is_string V
 < search.

Subgoal 1.26:

Variables: V VL VI I L
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
IsE : is_expr (index L I)
V : vars (index L I) V @
V1 : vars L VL *
V2 : vars I VI *
V3 : VL ++ VI = V
============================
 is_list is_string V
 < case IsE.

Subgoal 1.26:

Variables: V VL VI I L
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (index L I) V @
V1 : vars L VL *
V2 : vars I VI *
V3 : VL ++ VI = V
H1 : is_expr L
H2 : is_expr I
============================
 is_list is_string V
 < apply IH to _ V1.

Subgoal 1.26:

Variables: V VL VI I L
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (index L I) V @
V1 : vars L VL *
V2 : vars I VI *
V3 : VL ++ VI = V
H1 : is_expr L
H2 : is_expr I
H3 : is_list is_string VL
============================
 is_list is_string V
 < apply IH to _ V2.

Subgoal 1.26:

Variables: V VL VI I L
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (index L I) V @
V1 : vars L VL *
V2 : vars I VI *
V3 : VL ++ VI = V
H1 : is_expr L
H2 : is_expr I
H3 : is_list is_string VL
H4 : is_list is_string VI
============================
 is_list is_string V
 < apply append_list_string_is to _ _ V3.

Subgoal 1.26:

Variables: V VL VI I L
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (index L I) V @
V1 : vars L VL *
V2 : vars I VI *
V3 : VL ++ VI = V
H1 : is_expr L
H2 : is_expr I
H3 : is_list is_string VL
H4 : is_list is_string VI
H5 : is_list is_string V
============================
 is_list is_string V
 < search.

Subgoal 1.27:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
IsE : is_expr (exactEval:list:length E1)
V : vars (exactEval:list:length E1) V @
V1 : vars E1 V *
============================
 is_list is_string V
 < case IsE.

Subgoal 1.27:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (exactEval:list:length E1) V @
V1 : vars E1 V *
H1 : is_expr E1
============================
 is_list is_string V
 < apply IH to _ V1.

Subgoal 1.27:

Variables: V E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
        is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (exactEval:list:length E1) V @
V1 : vars E1 V *
H1 : is_expr E1
H2 : is_list is_string V
============================
 is_list is_string V
 < search.

Proof completed.
 < Prove exactEval:host:vars_exist,
         exactEval:host:varsArgs_exist,
         exactEval:host:varsRecFields_exist.

Subgoal 1.21:

Variables: Typ
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (nil Typ) @
IsE1 : is_typ Typ
============================
 exists V, vars (nil Typ) V
 < search.

Subgoal 1.22:

Variables: Expr Expr1
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (cons Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
============================
 exists V, vars (cons Expr1 Expr) V
 < V1: apply IH to IsE1.

Subgoal 1.22:

Variables: Expr Expr1 V
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (cons Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
============================
 exists V, vars (cons Expr1 Expr) V
 < V2: apply IH to IsE2.

Subgoal 1.22:

Variables: Expr Expr1 V V1
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (cons Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
V2 : vars Expr V1
============================
 exists V, vars (cons Expr1 Expr) V
 < IsV1: apply vars_is to _ V1.

Subgoal 1.22:

Variables: Expr Expr1 V V1
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (cons Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
V2 : vars Expr V1
IsV1 : is_list is_string V
============================
 exists V, vars (cons Expr1 Expr) V
 < IsV2: apply vars_is to _ V2.

Subgoal 1.22:

Variables: Expr Expr1 V V1
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (cons Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
V2 : vars Expr V1
IsV1 : is_list is_string V
IsV2 : is_list is_string V1
============================
 exists V, vars (cons Expr1 Expr) V
 < apply append_list_string_total to IsV1 IsV2.

Subgoal 1.22:

Variables: Expr Expr1 V V1 L3
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (cons Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
V2 : vars Expr V1
IsV1 : is_list is_string V
IsV2 : is_list is_string V1
H1 : V ++ V1 = L3
============================
 exists V, vars (cons Expr1 Expr) V
 < search.

Subgoal 1.23:

Variables: Expr
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (head Expr) @
IsE1 : is_expr Expr *
============================
 exists V, vars (head Expr) V
 < apply IH to IsE1.

Subgoal 1.23:

Variables: Expr V
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (head Expr) @
IsE1 : is_expr Expr *
H1 : vars Expr V
============================
 exists V, vars (head Expr) V
 < search.

Subgoal 1.24:

Variables: Expr
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (tail Expr) @
IsE1 : is_expr Expr *
============================
 exists V, vars (tail Expr) V
 < apply IH to IsE1.

Subgoal 1.24:

Variables: Expr V
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (tail Expr) @
IsE1 : is_expr Expr *
H1 : vars Expr V
============================
 exists V, vars (tail Expr) V
 < search.

Subgoal 1.25:

Variables: Expr
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (null Expr) @
IsE1 : is_expr Expr *
============================
 exists V, vars (null Expr) V
 < apply IH to IsE1.

Subgoal 1.25:

Variables: Expr V
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (null Expr) @
IsE1 : is_expr Expr *
H1 : vars Expr V
============================
 exists V, vars (null Expr) V
 < search.

Subgoal 1.26:

Variables: Expr Expr1
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (index Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
============================
 exists V, vars (index Expr1 Expr) V
 < V1: apply IH to IsE1.

Subgoal 1.26:

Variables: Expr Expr1 V
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (index Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
============================
 exists V, vars (index Expr1 Expr) V
 < V2: apply IH to IsE2.

Subgoal 1.26:

Variables: Expr Expr1 V V1
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (index Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
V2 : vars Expr V1
============================
 exists V, vars (index Expr1 Expr) V
 < IsV1: apply vars_is to _ V1.

Subgoal 1.26:

Variables: Expr Expr1 V V1
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (index Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
V2 : vars Expr V1
IsV1 : is_list is_string V
============================
 exists V, vars (index Expr1 Expr) V
 < IsV2: apply vars_is to _ V2.

Subgoal 1.26:

Variables: Expr Expr1 V V1
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (index Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
V2 : vars Expr V1
IsV1 : is_list is_string V
IsV2 : is_list is_string V1
============================
 exists V, vars (index Expr1 Expr) V
 < apply append_list_string_total to IsV1 IsV2.

Subgoal 1.26:

Variables: Expr Expr1 V V1 L3
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (index Expr1 Expr) @
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
V1 : vars Expr1 V
V2 : vars Expr V1
IsV1 : is_list is_string V
IsV2 : is_list is_string V1
H1 : V ++ V1 = L3
============================
 exists V, vars (index Expr1 Expr) V
 < search.

Subgoal 1.27:

Variables: Expr
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (exactEval:list:length Expr) @
IsE1 : is_expr Expr *
============================
 exists V, vars (exactEval:list:length Expr) V
 < apply IH to IsE1.

Subgoal 1.27:

Variables: Expr V
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (exactEval:list:length Expr) @
IsE1 : is_expr Expr *
H1 : vars Expr V
============================
 exists V, vars (exactEval:list:length Expr) V
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_is,
         exactEval:host:stmtNames_isCtx,
         exactEval:host:exprNames_is.

Subgoal 1.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
============================
 is_list is_string N
 < case IsS.

Subgoal 1.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 is_list is_string N
 < apply IH_E to _ _ SN2.

Subgoal 1.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_string NI
============================
 is_list is_string N
 < apply IH_E to _ _ SN3.

Subgoal 1.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_string NI
H5 : is_list is_string NE
============================
 is_list is_string N
 < apply append_list_string_is to _ _ SN4.

Subgoal 1.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_string NI
H5 : is_list is_string NE
H6 : is_list is_string N
============================
 is_list is_string N
 < search.

Subgoal 1.13:

Variables: Ctx' NI NE N1 L E I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @
SN1 : not_mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N1
============================
 is_list is_string (L::N1)
 < case IsS.

Subgoal 1.13:

Variables: Ctx' NI NE N1 L E I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @
SN1 : not_mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 is_list is_string (L::N1)
 < apply IH_E to _ _ SN2.

Subgoal 1.13:

Variables: Ctx' NI NE N1 L E I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @
SN1 : not_mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_string NI
============================
 is_list is_string (L::N1)
 < apply IH_E to _ _ SN3.

Subgoal 1.13:

Variables: Ctx' NI NE N1 L E I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @
SN1 : not_mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_string NI
H5 : is_list is_string NE
============================
 is_list is_string (L::N1)
 < apply append_list_string_is to _ _ SN4.

Subgoal 1.13:

Variables: Ctx' NI NE N1 L E I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @
SN1 : not_mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_string NI
H5 : is_list is_string NE
H6 : is_list is_string N1
============================
 is_list is_string (L::N1)
 < search.

Subgoal 1.14:

Variables: N Ctx' NL NB Ctx2 Body L I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsS : is_stmt (listForeach I L Body)
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @
SN1 : exprNames Ctx' L NL *
SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 *
SN3 : NL ++ NB = N
============================
 is_list is_string N
 < case IsS.

Subgoal 1.14:

Variables: N Ctx' NL NB Ctx2 Body L I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @
SN1 : exprNames Ctx' L NL *
SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 *
SN3 : NL ++ NB = N
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
============================
 is_list is_string N
 < apply IH_E to _ _ SN1.

Subgoal 1.14:

Variables: N Ctx' NL NB Ctx2 Body L I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @
SN1 : exprNames Ctx' L NL *
SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 *
SN3 : NL ++ NB = N
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list is_string NL
============================
 is_list is_string N
 < apply IH_S to _ _ SN2.

Subgoal 1.14:

Variables: N Ctx' NL NB Ctx2 Body L I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @
SN1 : exprNames Ctx' L NL *
SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 *
SN3 : NL ++ NB = N
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list is_string NL
H5 : is_list is_string NB
============================
 is_list is_string N
 < apply append_list_string_is to _ _ SN3.

Subgoal 1.14:

Variables: N Ctx' NL NB Ctx2 Body L I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @
SN1 : exprNames Ctx' L NL *
SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 *
SN3 : NL ++ NB = N
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list is_string NL
H5 : is_list is_string NB
H6 : is_list is_string N
============================
 is_list is_string N
 < search.

Subgoal 2.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
============================
 is_list (is_list is_string) Ctx'
 < case IsS.

Subgoal 2.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 is_list (is_list is_string) Ctx'
 < apply IH_E to _ _ SN2.

Subgoal 2.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_string NI
============================
 is_list (is_list is_string) Ctx'
 < apply IH_E to _ _ SN3.

Subgoal 2.12:

Variables: N Ctx' NI NE E I L
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) N Ctx' @
SN1 : mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_string NI
H5 : is_list is_string NE
============================
 is_list (is_list is_string) Ctx'
 < search.

Subgoal 2.13:

Variables: Ctx' NI NE N1 L E I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @
SN1 : not_mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N1
============================
 is_list (is_list is_string) Ctx'
 < case IsS.

Subgoal 2.13:

Variables: Ctx' NI NE N1 L E I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listUpdate L I E) (L::N1) Ctx' @
SN1 : not_mems L Ctx'
SN2 : exprNames Ctx' I NI *
SN3 : exprNames Ctx' E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 is_list (is_list is_string) Ctx'
 < search.

Subgoal 2.14:

Variables: N Ctx' NL NB Ctx2 Body L I
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsS : is_stmt (listForeach I L Body)
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (listForeach I L Body) N Ctx' @
SN1 : exprNames Ctx' L NL *
SN2 : stmtNames ([I]::Ctx') Body NB Ctx2 *
SN3 : NL ++ NB = N
============================
 is_list (is_list is_string) Ctx'
 < search.

Subgoal 3.22:

Variables: Ctx Ty
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsE : is_expr (nil Ty)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (nil Ty) [] @
============================
 is_list is_string []
 < search.

Subgoal 3.23:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsE : is_expr (cons E1 E2)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
============================
 is_list is_string N
 < case IsE.

Subgoal 3.23:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
============================
 is_list is_string N
 < apply IH_E to _ _ EN1.

Subgoal 3.23:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string N2
============================
 is_list is_string N
 < apply IH_E to _ _ EN2.

Subgoal 3.23:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string N2
H4 : is_list is_string N3
============================
 is_list is_string N
 < apply append_list_string_is to _ _ EN3.

Subgoal 3.23:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string N2
H4 : is_list is_string N3
H5 : is_list is_string N
============================
 is_list is_string N
 < search.

Subgoal 3.24:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsE : is_expr (head E1)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (head E1) N @
EN1 : exprNames Ctx E1 N *
============================
 is_list is_string N
 < case IsE.

Subgoal 3.24:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (head E1) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
============================
 is_list is_string N
 < apply IH_E to _ _ EN1.

Subgoal 3.24:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (head E1) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
H2 : is_list is_string N
============================
 is_list is_string N
 < search.

Subgoal 3.25:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsE : is_expr (tail E1)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (tail E1) N @
EN1 : exprNames Ctx E1 N *
============================
 is_list is_string N
 < case IsE.

Subgoal 3.25:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (tail E1) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
============================
 is_list is_string N
 < apply IH_E to _ _ EN1.

Subgoal 3.25:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (tail E1) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
H2 : is_list is_string N
============================
 is_list is_string N
 < search.

Subgoal 3.26:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsE : is_expr (null E1)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (null E1) N @
EN1 : exprNames Ctx E1 N *
============================
 is_list is_string N
 < case IsE.

Subgoal 3.26:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (null E1) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
============================
 is_list is_string N
 < apply IH_E to _ _ EN1.

Subgoal 3.26:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (null E1) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
H2 : is_list is_string N
============================
 is_list is_string N
 < search.

Subgoal 3.27:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsE : is_expr (index E1 E2)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
============================
 is_list is_string N
 < case IsE.

Subgoal 3.27:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
============================
 is_list is_string N
 < apply IH_E to _ _ EN1.

Subgoal 3.27:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string N2
============================
 is_list is_string N
 < apply IH_E to _ _ EN2.

Subgoal 3.27:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string N2
H4 : is_list is_string N3
============================
 is_list is_string N
 < apply append_list_string_is to _ _ EN3.

Subgoal 3.27:

Variables: Ctx N N2 N3 E2 E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_string N2
H4 : is_list is_string N3
H5 : is_list is_string N
============================
 is_list is_string N
 < search.

Subgoal 3.28:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsE : is_expr (exactEval:list:length E1)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (exactEval:list:length E1) N @
EN1 : exprNames Ctx E1 N *
============================
 is_list is_string N
 < case IsE.

Subgoal 3.28:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (exactEval:list:length E1) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
============================
 is_list is_string N
 < apply IH_E to _ _ EN1.

Subgoal 3.28:

Variables: Ctx N E1
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (exactEval:list:length E1) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
H2 : is_list is_string N
============================
 is_list is_string N
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_unique,
         exactEval:host:exprNames_unique.

Subgoal 1.12:

Variables: NA CtxA NB CtxB NI NE E I L
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) CtxA
SNA : stmtNames CtxA (listUpdate L I E) NA CtxA @
SNB : stmtNames CtxA (listUpdate L I E) NB CtxB
SNA1 : mems L CtxA
SNA2 : exprNames CtxA I NI *
SNA3 : exprNames CtxA E NE *
SNA4 : NI ++ NE = NA
============================
 NA = NB /\ CtxA = CtxB
 < case IsS.

Subgoal 1.12:

Variables: NA CtxA NB CtxB NI NE E I L
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxA
SNA : stmtNames CtxA (listUpdate L I E) NA CtxA @
SNB : stmtNames CtxA (listUpdate L I E) NB CtxB
SNA1 : mems L CtxA
SNA2 : exprNames CtxA I NI *
SNA3 : exprNames CtxA E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 NA = NB /\ CtxA = CtxB
 < SNB: case SNB.

Subgoal 1.12.1:

Variables: NA NB CtxB NI NE E I L NI1 NE1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) NA CtxB @
SNA1 : mems L CtxB
SNA2 : exprNames CtxB I NI *
SNA3 : exprNames CtxB E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply IH_E to _ _ SNA2 SNB1.

Subgoal 1.12.1:

Variables: NA NB CtxB NE E I L NI1 NE1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) NA CtxB @
SNA1 : mems L CtxB
SNA2 : exprNames CtxB I NI1 *
SNA3 : exprNames CtxB E NE *
SNA4 : NI1 ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply IH_E to _ _ SNA3 SNB2.

Subgoal 1.12.1:

Variables: NA NB CtxB E I L NI1 NE1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) NA CtxB @
SNA1 : mems L CtxB
SNA2 : exprNames CtxB I NI1 *
SNA3 : exprNames CtxB E NE1 *
SNA4 : NI1 ++ NE1 = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply append_unique to SNA4 SNB3.

Subgoal 1.12.1:

Variables: NB CtxB E I L NI1 NE1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) NB CtxB @
SNA1 : mems L CtxB
SNA2 : exprNames CtxB I NI1 *
SNA3 : exprNames CtxB E NE1 *
SNA4 : NI1 ++ NE1 = NB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 NB = NB /\ CtxB = CtxB
 < search.

Subgoal 1.12.2:

Variables: NA CtxB NI NE E I L NI1 NE1 N
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) NA CtxB @
SNA1 : mems L CtxB
SNA2 : exprNames CtxB I NI *
SNA3 : exprNames CtxB E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = N
============================
 NA = L::N /\ CtxB = CtxB
 < apply not_mems to SNB SNA1.

Subgoal 1.13:

Variables: CtxA NB CtxB NI NE N L E I
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) CtxA
SNA : stmtNames CtxA (listUpdate L I E) (L::N) CtxA @
SNB : stmtNames CtxA (listUpdate L I E) NB CtxB
SNA1 : not_mems L CtxA
SNA2 : exprNames CtxA I NI *
SNA3 : exprNames CtxA E NE *
SNA4 : NI ++ NE = N
============================
 L::N = NB /\ CtxA = CtxB
 < case IsS.

Subgoal 1.13:

Variables: CtxA NB CtxB NI NE N L E I
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxA
SNA : stmtNames CtxA (listUpdate L I E) (L::N) CtxA @
SNB : stmtNames CtxA (listUpdate L I E) NB CtxB
SNA1 : not_mems L CtxA
SNA2 : exprNames CtxA I NI *
SNA3 : exprNames CtxA E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 L::N = NB /\ CtxA = CtxB
 < SNB: case SNB.

Subgoal 1.13.1:

Variables: NB CtxB NI NE N L E I NI1 NE1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) (L::N) CtxB @
SNA1 : not_mems L CtxB
SNA2 : exprNames CtxB I NI *
SNA3 : exprNames CtxB E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 L::N = NB /\ CtxB = CtxB
 < apply not_mems to SNA1 SNB.

Subgoal 1.13.2:

Variables: CtxB NI NE N L E I NI1 NE1 N1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) (L::N) CtxB @
SNA1 : not_mems L CtxB
SNA2 : exprNames CtxB I NI *
SNA3 : exprNames CtxB E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 L::N = L::N1 /\ CtxB = CtxB
 < apply IH_E to _ _ SNA2 SNB1.

Subgoal 1.13.2:

Variables: CtxB NE N L E I NI1 NE1 N1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) (L::N) CtxB @
SNA1 : not_mems L CtxB
SNA2 : exprNames CtxB I NI1 *
SNA3 : exprNames CtxB E NE *
SNA4 : NI1 ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 L::N = L::N1 /\ CtxB = CtxB
 < apply IH_E to _ _ SNA3 SNB2.

Subgoal 1.13.2:

Variables: CtxB N L E I NI1 NE1 N1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) (L::N) CtxB @
SNA1 : not_mems L CtxB
SNA2 : exprNames CtxB I NI1 *
SNA3 : exprNames CtxB E NE1 *
SNA4 : NI1 ++ NE1 = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 L::N = L::N1 /\ CtxB = CtxB
 < apply append_unique to SNA4 SNB3.

Subgoal 1.13.2:

Variables: CtxB L E I NI1 NE1 N1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listUpdate L I E) (L::N1) CtxB @
SNA1 : not_mems L CtxB
SNA2 : exprNames CtxB I NI1 *
SNA3 : exprNames CtxB E NE1 *
SNA4 : NI1 ++ NE1 = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L CtxB
SNB1 : exprNames CtxB I NI1
SNB2 : exprNames CtxB E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 L::N1 = L::N1 /\ CtxB = CtxB
 < search.

Subgoal 1.14:

Variables: NA CtxA NB CtxB NL NB1 Ctx2 Body L I
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsS : is_stmt (listForeach I L Body)
IsCtx : is_list (is_list is_string) CtxA
SNA : stmtNames CtxA (listForeach I L Body) NA CtxA @
SNB : stmtNames CtxA (listForeach I L Body) NB CtxB
SNA1 : exprNames CtxA L NL *
SNA2 : stmtNames ([I]::CtxA) Body NB1 Ctx2 *
SNA3 : NL ++ NB1 = NA
============================
 NA = NB /\ CtxA = CtxB
 < case IsS.

Subgoal 1.14:

Variables: NA CtxA NB CtxB NL NB1 Ctx2 Body L I
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxA
SNA : stmtNames CtxA (listForeach I L Body) NA CtxA @
SNB : stmtNames CtxA (listForeach I L Body) NB CtxB
SNA1 : exprNames CtxA L NL *
SNA2 : stmtNames ([I]::CtxA) Body NB1 Ctx2 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
============================
 NA = NB /\ CtxA = CtxB
 < SNB: case SNB.

Subgoal 1.14:

Variables: NA NB CtxB NL NB1 Ctx2 Body L I NL1 NB2 Ctx1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listForeach I L Body) NA CtxB @
SNA1 : exprNames CtxB L NL *
SNA2 : stmtNames ([I]::CtxB) Body NB1 Ctx2 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames CtxB L NL1
SNB1 : stmtNames ([I]::CtxB) Body NB2 Ctx1
SNB2 : NL1 ++ NB2 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply IH_E to _ _ SNA1 SNB.

Subgoal 1.14:

Variables: NA NB CtxB NB1 Ctx2 Body L I NL1 NB2 Ctx1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listForeach I L Body) NA CtxB @
SNA1 : exprNames CtxB L NL1 *
SNA2 : stmtNames ([I]::CtxB) Body NB1 Ctx2 *
SNA3 : NL1 ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames CtxB L NL1
SNB1 : stmtNames ([I]::CtxB) Body NB2 Ctx1
SNB2 : NL1 ++ NB2 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply IH_S to _ _ SNA2 SNB1.

Subgoal 1.14:

Variables: NA NB CtxB Body L I NL1 NB2 Ctx1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listForeach I L Body) NA CtxB @
SNA1 : exprNames CtxB L NL1 *
SNA2 : stmtNames ([I]::CtxB) Body NB2 Ctx1 *
SNA3 : NL1 ++ NB2 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames CtxB L NL1
SNB1 : stmtNames ([I]::CtxB) Body NB2 Ctx1
SNB2 : NL1 ++ NB2 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply append_unique to SNA3 SNB2.

Subgoal 1.14:

Variables: NB CtxB Body L I NL1 NB2 Ctx1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (listForeach I L Body) NB CtxB @
SNA1 : exprNames CtxB L NL1 *
SNA2 : stmtNames ([I]::CtxB) Body NB2 Ctx1 *
SNA3 : NL1 ++ NB2 = NB
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames CtxB L NL1
SNB1 : stmtNames ([I]::CtxB) Body NB2 Ctx1
SNB2 : NL1 ++ NB2 = NB
============================
 NB = NB /\ CtxB = CtxB
 < search.

Subgoal 2.22:

Variables: Ctx NB Ty
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsE : is_expr (nil Ty)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (nil Ty) [] @
ENB : exprNames Ctx (nil Ty) NB
============================
 [] = NB
 < case ENB.

Subgoal 2.22:

Variables: Ctx Ty
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsE : is_expr (nil Ty)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (nil Ty) [] @
============================
 [] = []
 < search.

Subgoal 2.23:

Variables: Ctx NA NB N1 N2 E2 E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsE : is_expr (cons E1 E2)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (cons E1 E2) NA @
ENB : exprNames Ctx (cons E1 E2) NB
ENA1 : exprNames Ctx E1 N1 *
ENA2 : exprNames Ctx E2 N2 *
ENA3 : N1 ++ N2 = NA
============================
 NA = NB
 < case IsE.

Subgoal 2.23:

Variables: Ctx NA NB N1 N2 E2 E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (cons E1 E2) NA @
ENB : exprNames Ctx (cons E1 E2) NB
ENA1 : exprNames Ctx E1 N1 *
ENA2 : exprNames Ctx E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
============================
 NA = NB
 < ENB: case ENB.

Subgoal 2.23:

Variables: Ctx NA NB N1 N2 E2 E1 N3 N4
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (cons E1 E2) NA @
ENA1 : exprNames Ctx E1 N1 *
ENA2 : exprNames Ctx E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames Ctx E1 N3
ENB1 : exprNames Ctx E2 N4
ENB2 : N3 ++ N4 = NB
============================
 NA = NB
 < apply IH_E to _ _ ENA1 ENB.

Subgoal 2.23:

Variables: Ctx NA NB N2 E2 E1 N3 N4
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (cons E1 E2) NA @
ENA1 : exprNames Ctx E1 N3 *
ENA2 : exprNames Ctx E2 N2 *
ENA3 : N3 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames Ctx E1 N3
ENB1 : exprNames Ctx E2 N4
ENB2 : N3 ++ N4 = NB
============================
 NA = NB
 < apply IH_E to _ _ ENA2 ENB1.

Subgoal 2.23:

Variables: Ctx NA NB E2 E1 N3 N4
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (cons E1 E2) NA @
ENA1 : exprNames Ctx E1 N3 *
ENA2 : exprNames Ctx E2 N4 *
ENA3 : N3 ++ N4 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames Ctx E1 N3
ENB1 : exprNames Ctx E2 N4
ENB2 : N3 ++ N4 = NB
============================
 NA = NB
 < apply append_unique to ENA3 ENB2.

Subgoal 2.23:

Variables: Ctx NB E2 E1 N3 N4
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (cons E1 E2) NB @
ENA1 : exprNames Ctx E1 N3 *
ENA2 : exprNames Ctx E2 N4 *
ENA3 : N3 ++ N4 = NB
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames Ctx E1 N3
ENB1 : exprNames Ctx E2 N4
ENB2 : N3 ++ N4 = NB
============================
 NB = NB
 < search.

Subgoal 2.24:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsE : is_expr (head E1)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (head E1) NA @
ENB : exprNames Ctx (head E1) NB
ENA1 : exprNames Ctx E1 NA *
============================
 NA = NB
 < case IsE.

Subgoal 2.24:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (head E1) NA @
ENB : exprNames Ctx (head E1) NB
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
============================
 NA = NB
 < ENB: case ENB.

Subgoal 2.24:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (head E1) NA @
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
ENB : exprNames Ctx E1 NB
============================
 NA = NB
 < apply IH_E to _ _ ENA1 ENB.

Subgoal 2.24:

Variables: Ctx NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (head E1) NB @
ENA1 : exprNames Ctx E1 NB *
H1 : is_expr E1
ENB : exprNames Ctx E1 NB
============================
 NB = NB
 < search.

Subgoal 2.25:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsE : is_expr (tail E1)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (tail E1) NA @
ENB : exprNames Ctx (tail E1) NB
ENA1 : exprNames Ctx E1 NA *
============================
 NA = NB
 < case IsE.

Subgoal 2.25:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (tail E1) NA @
ENB : exprNames Ctx (tail E1) NB
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
============================
 NA = NB
 < ENB: case ENB.

Subgoal 2.25:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (tail E1) NA @
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
ENB : exprNames Ctx E1 NB
============================
 NA = NB
 < apply IH_E to _ _ ENA1 ENB.

Subgoal 2.25:

Variables: Ctx NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (tail E1) NB @
ENA1 : exprNames Ctx E1 NB *
H1 : is_expr E1
ENB : exprNames Ctx E1 NB
============================
 NB = NB
 < search.

Subgoal 2.26:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsE : is_expr (null E1)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (null E1) NA @
ENB : exprNames Ctx (null E1) NB
ENA1 : exprNames Ctx E1 NA *
============================
 NA = NB
 < case IsE.

Subgoal 2.26:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (null E1) NA @
ENB : exprNames Ctx (null E1) NB
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
============================
 NA = NB
 < ENB: case ENB.

Subgoal 2.26:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (null E1) NA @
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
ENB : exprNames Ctx E1 NB
============================
 NA = NB
 < apply IH_E to _ _ ENA1 ENB.

Subgoal 2.26:

Variables: Ctx NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (null E1) NB @
ENA1 : exprNames Ctx E1 NB *
H1 : is_expr E1
ENB : exprNames Ctx E1 NB
============================
 NB = NB
 < search.

Subgoal 2.27:

Variables: Ctx NA NB N1 N2 E2 E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsE : is_expr (index E1 E2)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (index E1 E2) NA @
ENB : exprNames Ctx (index E1 E2) NB
ENA1 : exprNames Ctx E1 N1 *
ENA2 : exprNames Ctx E2 N2 *
ENA3 : N1 ++ N2 = NA
============================
 NA = NB
 < case IsE.

Subgoal 2.27:

Variables: Ctx NA NB N1 N2 E2 E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (index E1 E2) NA @
ENB : exprNames Ctx (index E1 E2) NB
ENA1 : exprNames Ctx E1 N1 *
ENA2 : exprNames Ctx E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
============================
 NA = NB
 < ENB: case ENB.

Subgoal 2.27:

Variables: Ctx NA NB N1 N2 E2 E1 N3 N4
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (index E1 E2) NA @
ENA1 : exprNames Ctx E1 N1 *
ENA2 : exprNames Ctx E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames Ctx E1 N3
ENB1 : exprNames Ctx E2 N4
ENB2 : N3 ++ N4 = NB
============================
 NA = NB
 < apply IH_E to _ _ ENA1 ENB.

Subgoal 2.27:

Variables: Ctx NA NB N2 E2 E1 N3 N4
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (index E1 E2) NA @
ENA1 : exprNames Ctx E1 N3 *
ENA2 : exprNames Ctx E2 N2 *
ENA3 : N3 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames Ctx E1 N3
ENB1 : exprNames Ctx E2 N4
ENB2 : N3 ++ N4 = NB
============================
 NA = NB
 < apply IH_E to _ _ ENA2 ENB1.

Subgoal 2.27:

Variables: Ctx NA NB E2 E1 N3 N4
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (index E1 E2) NA @
ENA1 : exprNames Ctx E1 N3 *
ENA2 : exprNames Ctx E2 N4 *
ENA3 : N3 ++ N4 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames Ctx E1 N3
ENB1 : exprNames Ctx E2 N4
ENB2 : N3 ++ N4 = NB
============================
 NA = NB
 < apply append_unique to ENA3 ENB2.

Subgoal 2.27:

Variables: Ctx NB E2 E1 N3 N4
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (index E1 E2) NB @
ENA1 : exprNames Ctx E1 N3 *
ENA2 : exprNames Ctx E2 N4 *
ENA3 : N3 ++ N4 = NB
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames Ctx E1 N3
ENB1 : exprNames Ctx E2 N4
ENB2 : N3 ++ N4 = NB
============================
 NB = NB
 < search.

Subgoal 2.28:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsE : is_expr (exactEval:list:length E1)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (exactEval:list:length E1) NA @
ENB : exprNames Ctx (exactEval:list:length E1) NB
ENA1 : exprNames Ctx E1 NA *
============================
 NA = NB
 < case IsE.

Subgoal 2.28:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (exactEval:list:length E1) NA @
ENB : exprNames Ctx (exactEval:list:length E1) NB
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
============================
 NA = NB
 < ENB: case ENB.

Subgoal 2.28:

Variables: Ctx NA NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (exactEval:list:length E1) NA @
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
ENB : exprNames Ctx E1 NB
============================
 NA = NB
 < apply IH_E to _ _ ENA1 ENB.

Subgoal 2.28:

Variables: Ctx NB E1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (exactEval:list:length E1) NB @
ENA1 : exprNames Ctx E1 NB *
H1 : is_expr E1
ENB : exprNames Ctx E1 NB
============================
 NB = NB
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_keep_older.

Subgoal 12:

Variables: Scope Ctx N NI NE E I L
IH : forall Scope Ctx S N Ctx',
       is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
       exists Scope',
         Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @
SN1 : mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N
============================
 exists Scope',
   Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
 < search.

Subgoal 13:

Variables: Scope Ctx NI NE N1 L E I
IH : forall Scope Ctx S N Ctx',
       is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
       exists Scope',
         Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @
SN1 : not_mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N1
============================
 exists Scope',
   Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
 < search.

Subgoal 14:

Variables: Scope Ctx N NL NB Ctx2 Body L I
IH : forall Scope Ctx S N Ctx',
       is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
       exists Scope',
         Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
IsS : is_stmt (listForeach I L Body)
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @
SN1 : exprNames (Scope::Ctx) L NL *
SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 *
SN3 : NL ++ NB = N
============================
 exists Scope',
   Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_exists,
         exactEval:host:exprNames_exists,
         exactEval:host:argsNames_exists,
         exactEval:host:recFieldNames_exists.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 S1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < EN1: apply IH_E to IsS2 IsCtx.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 S1 N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
EN1 : exprNames (Scope::Ctx) Expr1 N
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < EN2: apply IH_E to IsS3 IsCtx.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 S1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
EN1 : exprNames (Scope::Ctx) Expr1 N
EN2 : exprNames (Scope::Ctx) Expr N1
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < Is1: apply exprNames_is to _ _ EN1.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 S1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
EN1 : exprNames (Scope::Ctx) Expr1 N
EN2 : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < Is2: apply exprNames_is to _ _ EN2.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 S1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
EN1 : exprNames (Scope::Ctx) Expr1 N
EN2 : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < apply append_list_string_total to Is1 Is2.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 S1 N N1 L3
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
EN1 : exprNames (Scope::Ctx) Expr1 N
EN2 : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
H1 : N ++ N1 = L3
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < Or: apply mems_or_not_mems to IsCtx IsS1.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 S1 N N1 L3
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
EN1 : exprNames (Scope::Ctx) Expr1 N
EN2 : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
H1 : N ++ N1 = L3
Or : mems S1 (Scope::Ctx) \/ not_mems S1 (Scope::Ctx)
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < M: case Or.

Subgoal 1.10.1:

Variables: Scope Ctx Expr Expr1 S1 N N1 L3
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
EN1 : exprNames (Scope::Ctx) Expr1 N
EN2 : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
H1 : N ++ N1 = L3
M : mems S1 (Scope::Ctx)
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < search.

Subgoal 1.10.2:

Variables: Scope Ctx Expr Expr1 S1 N N1 L3
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listUpdate S1 Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr1 *
IsS3 : is_expr Expr *
EN1 : exprNames (Scope::Ctx) Expr1 N
EN2 : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
H1 : N ++ N1 = L3
M : not_mems S1 (Scope::Ctx)
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listUpdate S1 Expr1 Expr) N Ctx'
 < search.

Subgoal 1.11:

Variables: Scope Ctx Stmt Expr S1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listForeach S1 Expr Stmt) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr *
IsS3 : is_stmt Stmt *
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
 < EN: apply IH_E to IsS2 IsCtx.

Subgoal 1.11:

Variables: Scope Ctx Stmt Expr S1 N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listForeach S1 Expr Stmt) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr *
IsS3 : is_stmt Stmt *
EN : exprNames (Scope::Ctx) Expr N
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
 < SN: apply IH_S to IsS3 _ with
         Ctx = Scope::Ctx Scope = [S1].

Subgoal 1.11:

Variables: Scope Ctx Stmt Expr S1 N N1 Ctx'
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listForeach S1 Expr Stmt) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr *
IsS3 : is_stmt Stmt *
EN : exprNames (Scope::Ctx) Expr N
SN : stmtNames ([S1]::(Scope::Ctx)) Stmt N1 Ctx'
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
 < Is1: apply exprNames_is to _ _ EN.

Subgoal 1.11:

Variables: Scope Ctx Stmt Expr S1 N N1 Ctx'
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listForeach S1 Expr Stmt) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr *
IsS3 : is_stmt Stmt *
EN : exprNames (Scope::Ctx) Expr N
SN : stmtNames ([S1]::(Scope::Ctx)) Stmt N1 Ctx'
Is1 : is_list is_string N
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
 < Is2: apply stmtNames_is to _ _ SN.

Subgoal 1.11:

Variables: Scope Ctx Stmt Expr S1 N N1 Ctx'
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listForeach S1 Expr Stmt) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr *
IsS3 : is_stmt Stmt *
EN : exprNames (Scope::Ctx) Expr N
SN : stmtNames ([S1]::(Scope::Ctx)) Stmt N1 Ctx'
Is1 : is_list is_string N
Is2 : is_list is_string N1
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
 < apply append_list_string_total to Is1 Is2.

Subgoal 1.11:

Variables: Scope Ctx Stmt Expr S1 N N1 Ctx' L3
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (listForeach S1 Expr Stmt) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_string S1
IsS2 : is_expr Expr *
IsS3 : is_stmt Stmt *
EN : exprNames (Scope::Ctx) Expr N
SN : stmtNames ([S1]::(Scope::Ctx)) Stmt N1 Ctx'
Is1 : is_list is_string N
Is2 : is_list is_string N1
H1 : N ++ N1 = L3
============================
 exists N Ctx', stmtNames (Scope::Ctx) (listForeach S1 Expr Stmt) N Ctx'
 < search.

Subgoal 2.21:

Variables: Ctx Typ
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (nil Typ) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_typ Typ
============================
 exists N, exprNames Ctx (nil Typ) N
 < search.

Subgoal 2.22:

Variables: Ctx Expr Expr1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (cons Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
============================
 exists N, exprNames Ctx (cons Expr1 Expr) N
 < EN1: apply IH_E to IsE1 IsCtx.

Subgoal 2.22:

Variables: Ctx Expr Expr1 N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (cons Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
============================
 exists N, exprNames Ctx (cons Expr1 Expr) N
 < EN2: apply IH_E to IsE2 IsCtx.

Subgoal 2.22:

Variables: Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (cons Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
EN2 : exprNames Ctx Expr N1
============================
 exists N, exprNames Ctx (cons Expr1 Expr) N
 < Is1: apply exprNames_is to _ _ EN1.

Subgoal 2.22:

Variables: Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (cons Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
EN2 : exprNames Ctx Expr N1
Is1 : is_list is_string N
============================
 exists N, exprNames Ctx (cons Expr1 Expr) N
 < Is2: apply exprNames_is to _ _ EN2.

Subgoal 2.22:

Variables: Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (cons Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
EN2 : exprNames Ctx Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
============================
 exists N, exprNames Ctx (cons Expr1 Expr) N
 < apply append_list_string_total to Is1 Is2.

Subgoal 2.22:

Variables: Ctx Expr Expr1 N N1 L3
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (cons Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
EN2 : exprNames Ctx Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
H1 : N ++ N1 = L3
============================
 exists N, exprNames Ctx (cons Expr1 Expr) N
 < search.

Subgoal 2.23:

Variables: Ctx Expr
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (head Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
============================
 exists N, exprNames Ctx (head Expr) N
 < apply IH_E to IsE1 IsCtx.

Subgoal 2.23:

Variables: Ctx Expr N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (head Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
H1 : exprNames Ctx Expr N
============================
 exists N, exprNames Ctx (head Expr) N
 < search.

Subgoal 2.24:

Variables: Ctx Expr
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (tail Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
============================
 exists N, exprNames Ctx (tail Expr) N
 < apply IH_E to IsE1 IsCtx.

Subgoal 2.24:

Variables: Ctx Expr N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (tail Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
H1 : exprNames Ctx Expr N
============================
 exists N, exprNames Ctx (tail Expr) N
 < search.

Subgoal 2.25:

Variables: Ctx Expr
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (null Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
============================
 exists N, exprNames Ctx (null Expr) N
 < apply IH_E to IsE1 IsCtx.

Subgoal 2.25:

Variables: Ctx Expr N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (null Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
H1 : exprNames Ctx Expr N
============================
 exists N, exprNames Ctx (null Expr) N
 < search.

Subgoal 2.26:

Variables: Ctx Expr Expr1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (index Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
============================
 exists N, exprNames Ctx (index Expr1 Expr) N
 < EN1: apply IH_E to IsE1 IsCtx.

Subgoal 2.26:

Variables: Ctx Expr Expr1 N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (index Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
============================
 exists N, exprNames Ctx (index Expr1 Expr) N
 < EN2: apply IH_E to IsE2 IsCtx.

Subgoal 2.26:

Variables: Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (index Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
EN2 : exprNames Ctx Expr N1
============================
 exists N, exprNames Ctx (index Expr1 Expr) N
 < Is1: apply exprNames_is to _ _ EN1.

Subgoal 2.26:

Variables: Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (index Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
EN2 : exprNames Ctx Expr N1
Is1 : is_list is_string N
============================
 exists N, exprNames Ctx (index Expr1 Expr) N
 < Is2: apply exprNames_is to _ _ EN2.

Subgoal 2.26:

Variables: Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (index Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
EN2 : exprNames Ctx Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
============================
 exists N, exprNames Ctx (index Expr1 Expr) N
 < apply append_list_string_total to Is1 Is2.

Subgoal 2.26:

Variables: Ctx Expr Expr1 N N1 L3
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (index Expr1 Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr1 *
IsE2 : is_expr Expr *
EN1 : exprNames Ctx Expr1 N
EN2 : exprNames Ctx Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
H1 : N ++ N1 = L3
============================
 exists N, exprNames Ctx (index Expr1 Expr) N
 < search.

Subgoal 2.27:

Variables: Ctx Expr
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (exactEval:list:length Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
============================
 exists N, exprNames Ctx (exactEval:list:length Expr) N
 < apply IH_E to IsE1 IsCtx.

Subgoal 2.27:

Variables: Ctx Expr N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsE : is_expr (exactEval:list:length Expr) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
H1 : exprNames Ctx Expr N
============================
 exists N, exprNames Ctx (exactEval:list:length Expr) N
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_not_in_ctx,
         exactEval:host:exprNames_not_in_ctx.

Subgoal 1.12:

Variables: Scope Ctx N X NI NE E I L
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N
============================
 false
 < case IsS.

Subgoal 1.12:

Variables: Scope Ctx N X NI NE E I L
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 false
 < Or: apply mem_append to MemN SN4.

Subgoal 1.12:

Variables: Scope Ctx N X NI NE E I L
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Or : mem X NI \/ mem X NE
============================
 false
 < M: case Or.

Subgoal 1.12.1:

Variables: Scope Ctx N X NI NE E I L
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
M : mem X NI
============================
 false
 < apply IH_E to _ _ SN2 M MemsCtx.

Subgoal 1.12.2:

Variables: Scope Ctx N X NI NE E I L
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
M : mem X NE
============================
 false
 < apply IH_E to _ _ SN3 M MemsCtx.

Subgoal 1.13:

Variables: Scope Ctx X NI NE N1 L E I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsS : is_stmt (listUpdate L I E)
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @
MemN : mem X (L::N1)
MemsCtx : mems X (Scope::Ctx)
SN1 : not_mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N1
============================
 false
 < case IsS.

Subgoal 1.13:

Variables: Scope Ctx X NI NE N1 L E I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @
MemN : mem X (L::N1)
MemsCtx : mems X (Scope::Ctx)
SN1 : not_mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 false
 < MN: case MemN.

Subgoal 1.13.1:

Variables: Scope Ctx NI NE N1 L E I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @
MemsCtx : mems L (Scope::Ctx)
SN1 : not_mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 false
 < apply not_mems to SN1 MemsCtx.

Subgoal 1.13.2:

Variables: Scope Ctx X NI NE N1 L E I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @
MemsCtx : mems X (Scope::Ctx)
SN1 : not_mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
MN : mem X N1
============================
 false
 < Or: apply mem_append to MN SN4.

Subgoal 1.13.2:

Variables: Scope Ctx X NI NE N1 L E I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @
MemsCtx : mems X (Scope::Ctx)
SN1 : not_mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
MN : mem X N1
Or : mem X NI \/ mem X NE
============================
 false
 < M: case Or.

Subgoal 1.13.2.1:

Variables: Scope Ctx X NI NE N1 L E I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @
MemsCtx : mems X (Scope::Ctx)
SN1 : not_mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
MN : mem X N1
M : mem X NI
============================
 false
 < apply IH_E to _ _ SN2 M MemsCtx.

Subgoal 1.13.2.2:

Variables: Scope Ctx X NI NE N1 L E I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) (L::N1) (Scope::Ctx) @
MemsCtx : mems X (Scope::Ctx)
SN1 : not_mems L (Scope::Ctx)
SN2 : exprNames (Scope::Ctx) I NI *
SN3 : exprNames (Scope::Ctx) E NE *
SN4 : NI ++ NE = N1
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
MN : mem X N1
M : mem X NE
============================
 false
 < apply IH_E to _ _ SN3 M MemsCtx.

Subgoal 1.14:

Variables: Scope Ctx N X NL NB Ctx2 Body L I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsS : is_stmt (listForeach I L Body)
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) L NL *
SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 *
SN3 : NL ++ NB = N
============================
 false
 < case IsS.

Subgoal 1.14:

Variables: Scope Ctx N X NL NB Ctx2 Body L I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) L NL *
SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 *
SN3 : NL ++ NB = N
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
============================
 false
 < Or: apply mem_append to MemN SN3.

Subgoal 1.14:

Variables: Scope Ctx N X NL NB Ctx2 Body L I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) L NL *
SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 *
SN3 : NL ++ NB = N
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
Or : mem X NL \/ mem X NB
============================
 false
 < M: case Or.

Subgoal 1.14.1:

Variables: Scope Ctx N X NL NB Ctx2 Body L I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) L NL *
SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 *
SN3 : NL ++ NB = N
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
M : mem X NL
============================
 false
 < apply IH_E to _ _ SN1 M MemsCtx.

Subgoal 1.14.2:

Variables: Scope Ctx N X NL NB Ctx2 Body L I
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach I L Body) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) L NL *
SN2 : stmtNames ([I]::(Scope::Ctx)) Body NB Ctx2 *
SN3 : NL ++ NB = N
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
M : mem X NB
============================
 false
 < apply IH_S to _ _ SN2 M _.

Subgoal 2.22:

Variables: Ctx X Ty
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsE : is_expr (nil Ty)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (nil Ty) [] @
MemN : mem X []
MemsCtx : mems X Ctx
============================
 false
 < case MemN.

Subgoal 2.23:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsE : is_expr (cons E1 E2)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
============================
 false
 < case IsE.

Subgoal 2.23:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
============================
 false
 < Or: apply mem_append to MemN EN3.

Subgoal 2.23:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
Or : mem X N2 \/ mem X N3
============================
 false
 < M: case Or.

Subgoal 2.23.1:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
M : mem X N2
============================
 false
 < apply IH_E to _ _ EN1 M MemsCtx.

Subgoal 2.23.2:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
M : mem X N3
============================
 false
 < apply IH_E to _ _ EN2 M MemsCtx.

Subgoal 2.24:

Variables: Ctx N X E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsE : is_expr (head E1)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (head E1) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
============================
 false
 < case IsE.

Subgoal 2.24:

Variables: Ctx N X E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (head E1) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
============================
 false
 < apply IH_E to _ _ EN1 MemN MemsCtx.

Subgoal 2.25:

Variables: Ctx N X E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsE : is_expr (tail E1)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (tail E1) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
============================
 false
 < case IsE.

Subgoal 2.25:

Variables: Ctx N X E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (tail E1) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
============================
 false
 < apply IH_E to _ _ EN1 MemN MemsCtx.

Subgoal 2.26:

Variables: Ctx N X E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsE : is_expr (null E1)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (null E1) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
============================
 false
 < case IsE.

Subgoal 2.26:

Variables: Ctx N X E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (null E1) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
============================
 false
 < apply IH_E to _ _ EN1 MemN MemsCtx.

Subgoal 2.27:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsE : is_expr (index E1 E2)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
============================
 false
 < case IsE.

Subgoal 2.27:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
============================
 false
 < Or: apply mem_append to MemN EN3.

Subgoal 2.27:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
Or : mem X N2 \/ mem X N3
============================
 false
 < M: case Or.

Subgoal 2.27.1:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
M : mem X N2
============================
 false
 < apply IH_E to _ _ EN1 M MemsCtx.

Subgoal 2.27.2:

Variables: Ctx N X N2 N3 E2 E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index E1 E2) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N2 *
EN2 : exprNames Ctx E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
M : mem X N3
============================
 false
 < apply IH_E to _ _ EN2 M MemsCtx.

Subgoal 2.28:

Variables: Ctx N X E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsE : is_expr (exactEval:list:length E1)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (exactEval:list:length E1) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
============================
 false
 < case IsE.

Subgoal 2.28:

Variables: Ctx N X E1
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (exactEval:list:length E1) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
============================
 false
 < apply IH_E to _ _ EN1 MemN MemsCtx.

Proof completed.
 < Prove exactEval:host:stmtNames_relatedCtxs,
         exactEval:host:stmtNames_relatedCtxs_ctx_fwd,
         exactEval:host:stmtNames_relatedCtxs_ctx_back,
         exactEval:host:exprNames_relatedCtxs.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < Is': case IsS.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < EN1: apply IH_E to _ _ _ RelAB RelBA SN2.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < EN2: apply IH_E to _ _ _ RelAB RelBA SN3.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < Is1: apply exprNames_is to _ _ EN1.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < Is2: apply exprNames_is to _ _ EN2.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < Or: apply mems_or_not_mems to IsCtxB Is'.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
Or : mems L (ScopeB::CtxB) \/ not_mems L (ScopeB::CtxB)
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < M: case Or.

Subgoal 1.12.1:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
M : mems L (ScopeB::CtxB)
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < search.

Subgoal 1.12.2:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
M : not_mems L (ScopeB::CtxB)
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < MB: apply RelAB to SN1.

Subgoal 1.12.2:

Variables: ScopeA CtxA N ScopeB CtxB NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) N (ScopeA::CtxA) @
SN1 : mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
M : not_mems L (ScopeB::CtxB)
MB : mems L (ScopeB::CtxB)
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) N CtxB'
 < apply not_mems to M MB.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < Is': case IsS.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < EN1: apply IH_E to _ _ _ RelAB RelBA SN2.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < EN2: apply IH_E to _ _ _ RelAB RelBA SN3.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < Is1: apply exprNames_is to _ _ EN1.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < Is2: apply exprNames_is to _ _ EN2.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < Or: apply mems_or_not_mems to IsCtxB Is'.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
Or : mems L (ScopeB::CtxB) \/ not_mems L (ScopeB::CtxB)
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < M: case Or.

Subgoal 1.13.1:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
M : mems L (ScopeB::CtxB)
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < MA: apply RelBA to M.

Subgoal 1.13.1:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
M : mems L (ScopeB::CtxB)
MA : mems L (ScopeA::CtxA)
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < apply not_mems to SN1 MA.

Subgoal 1.13.2:

Variables: ScopeA CtxA ScopeB CtxB NI NE N1 L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N1) (ScopeA::CtxA) @
SN1 : not_mems L (ScopeA::CtxA)
SN2 : exprNames (ScopeA::CtxA) I NI *
SN3 : exprNames (ScopeA::CtxA) E NE *
SN4 : NI ++ NE = N1
Is' : is_string L
Is'1 : is_expr I
Is'2 : is_expr E
EN1 : exprNames (ScopeB::CtxB) I NI
EN2 : exprNames (ScopeB::CtxB) E NE
Is1 : is_list is_string NI
Is2 : is_list is_string NE
M : not_mems L (ScopeB::CtxB)
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listUpdate L I E) (L::N1) CtxB'
 < search.

Subgoal 1.14:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listForeach I L Body)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listForeach I L Body) N CtxB'
 < Is': case IsS.

Subgoal 1.14:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listForeach I L Body) N CtxB'
 < EN: apply IH_E to _ _ _ RelAB RelBA SN1.

Subgoal 1.14:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listForeach I L Body) N CtxB'
 < SN: apply IH_S to _ _ _ _ _ SN2 with
         ScopeB = [I] CtxB = ScopeB::CtxB.

Subgoal 1.14.1:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
============================
 forall X, mems X ([I]::(ScopeB::CtxB)) -> mems X ([I]::(ScopeA::CtxA))
 < intros M.

Subgoal 1.14.1:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
M : mems X ([I]::(ScopeB::CtxB))
============================
 mems X ([I]::(ScopeA::CtxA))
 < M: case M.

Subgoal 1.14.1.1:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
M : mem X [I]
============================
 mems X ([I]::(ScopeA::CtxA))
 < search.

Subgoal 1.14.1.2:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
M : mems X (ScopeB::CtxB)
============================
 mems X ([I]::(ScopeA::CtxA))
 < apply RelBA to M.

Subgoal 1.14.1.2:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
M : mems X (ScopeB::CtxB)
H1 : mems X (ScopeA::CtxA)
============================
 mems X ([I]::(ScopeA::CtxA))
 < search.

Subgoal 1.14.2:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
============================
 forall X, mems X ([I]::(ScopeA::CtxA)) -> mems X ([I]::(ScopeB::CtxB))
 < intros M.

Subgoal 1.14.2:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
M : mems X ([I]::(ScopeA::CtxA))
============================
 mems X ([I]::(ScopeB::CtxB))
 < M: case M.

Subgoal 1.14.2.1:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
M : mem X [I]
============================
 mems X ([I]::(ScopeB::CtxB))
 < search.

Subgoal 1.14.2.2:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
M : mems X (ScopeA::CtxA)
============================
 mems X ([I]::(ScopeB::CtxB))
 < apply RelAB to M.

Subgoal 1.14.2.2:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I X
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
M : mems X (ScopeA::CtxA)
H1 : mems X (ScopeB::CtxB)
============================
 mems X ([I]::(ScopeB::CtxB))
 < search.

Subgoal 1.14:

Variables: ScopeA CtxA N ScopeB CtxB NL NB Ctx1 Body L I CtxB'
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (listForeach I L Body) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) L NL *
SN2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB Ctx1 *
SN3 : NL ++ NB = N
Is' : is_string I
Is'1 : is_expr L
Is'2 : is_stmt Body
EN : exprNames (ScopeB::CtxB) L NL
SN4 : stmtNames ([I]::(ScopeB::CtxB)) Body NB CtxB'
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (listForeach I L Body) N CtxB'
 < search.

Subgoal 2.12:

Variables: NA CtxA' CtxB NB CtxB' X NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB
SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @
SNB : stmtNames CtxB (listUpdate L I E) NB CtxB'
Mems : mems X CtxA'
SNA1 : mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = NA
============================
 mems X CtxB'
 < SNB: case SNB.

Subgoal 2.12.1:

Variables: NA CtxA' NB CtxB' X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB'
SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @
Mems : mems X CtxA'
SNA1 : mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = NA
SNB : mems L CtxB'
SNB1 : exprNames CtxB' I NI1
SNB2 : exprNames CtxB' E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 mems X CtxB'
 < backchain RelAB.

Subgoal 2.12.2:

Variables: NA CtxA' CtxB' X NI NE E I L NI1 NE1 N
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB'
SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @
Mems : mems X CtxA'
SNA1 : mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = NA
SNB : not_mems L CtxB'
SNB1 : exprNames CtxB' I NI1
SNB2 : exprNames CtxB' E NE1
SNB3 : NI1 ++ NE1 = N
============================
 mems X CtxB'
 < backchain RelAB.

Subgoal 2.13:

Variables: CtxA' CtxB NB CtxB' X NI NE N L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB
SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @
SNB : stmtNames CtxB (listUpdate L I E) NB CtxB'
Mems : mems X CtxA'
SNA1 : not_mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = N
============================
 mems X CtxB'
 < SNB: case SNB.

Subgoal 2.13.1:

Variables: CtxA' NB CtxB' X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB'
SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @
Mems : mems X CtxA'
SNA1 : not_mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = N
SNB : mems L CtxB'
SNB1 : exprNames CtxB' I NI1
SNB2 : exprNames CtxB' E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 mems X CtxB'
 < backchain RelAB.

Subgoal 2.13.2:

Variables: CtxA' CtxB' X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB'
SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @
Mems : mems X CtxA'
SNA1 : not_mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = N
SNB : not_mems L CtxB'
SNB1 : exprNames CtxB' I NI1
SNB2 : exprNames CtxB' E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 mems X CtxB'
 < backchain RelAB.

Subgoal 2.14:

Variables: NA CtxA' CtxB NB CtxB' X NL NB1 Ctx1 Body L I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listForeach I L Body)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB
SNA : stmtNames CtxA' (listForeach I L Body) NA CtxA' @
SNB : stmtNames CtxB (listForeach I L Body) NB CtxB'
Mems : mems X CtxA'
SNA1 : exprNames CtxA' L NL *
SNA2 : stmtNames ([I]::CtxA') Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
============================
 mems X CtxB'
 < SNB: case SNB.

Subgoal 2.14:

Variables: NA CtxA' NB CtxB' X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listForeach I L Body)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB'
SNA : stmtNames CtxA' (listForeach I L Body) NA CtxA' @
Mems : mems X CtxA'
SNA1 : exprNames CtxA' L NL *
SNA2 : stmtNames ([I]::CtxA') Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
SNB : exprNames CtxB' L NL1
SNB1 : stmtNames ([I]::CtxB') Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
============================
 mems X CtxB'
 < backchain RelAB.

Subgoal 3.12:

Variables: NA CtxA' CtxB NB CtxB' X NI NE E I L
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA'
SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @
SNB : stmtNames CtxB (listUpdate L I E) NB CtxB'
Mems : mems X CtxB'
SNA1 : mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = NA
============================
 mems X CtxA'
 < SNB: case SNB.

Subgoal 3.12.1:

Variables: NA CtxA' NB CtxB' X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA'
SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @
Mems : mems X CtxB'
SNA1 : mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = NA
SNB : mems L CtxB'
SNB1 : exprNames CtxB' I NI1
SNB2 : exprNames CtxB' E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 mems X CtxA'
 < backchain RelBA.

Subgoal 3.12.2:

Variables: NA CtxA' CtxB' X NI NE E I L NI1 NE1 N
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA'
SNA : stmtNames CtxA' (listUpdate L I E) NA CtxA' @
Mems : mems X CtxB'
SNA1 : mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = NA
SNB : not_mems L CtxB'
SNB1 : exprNames CtxB' I NI1
SNB2 : exprNames CtxB' E NE1
SNB3 : NI1 ++ NE1 = N
============================
 mems X CtxA'
 < backchain RelBA.

Subgoal 3.13:

Variables: CtxA' CtxB NB CtxB' X NI NE N L E I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA'
SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @
SNB : stmtNames CtxB (listUpdate L I E) NB CtxB'
Mems : mems X CtxB'
SNA1 : not_mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = N
============================
 mems X CtxA'
 < SNB: case SNB.

Subgoal 3.13.1:

Variables: CtxA' NB CtxB' X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA'
SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @
Mems : mems X CtxB'
SNA1 : not_mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = N
SNB : mems L CtxB'
SNB1 : exprNames CtxB' I NI1
SNB2 : exprNames CtxB' E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 mems X CtxA'
 < backchain RelBA.

Subgoal 3.13.2:

Variables: CtxA' CtxB' X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA'
SNA : stmtNames CtxA' (listUpdate L I E) (L::N) CtxA' @
Mems : mems X CtxB'
SNA1 : not_mems L CtxA'
SNA2 : exprNames CtxA' I NI *
SNA3 : exprNames CtxA' E NE *
SNA4 : NI ++ NE = N
SNB : not_mems L CtxB'
SNB1 : exprNames CtxB' I NI1
SNB2 : exprNames CtxB' E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 mems X CtxA'
 < backchain RelBA.

Subgoal 3.14:

Variables: NA CtxA' CtxB NB CtxB' X NL NB1 Ctx1 Body L I
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listForeach I L Body)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA'
SNA : stmtNames CtxA' (listForeach I L Body) NA CtxA' @
SNB : stmtNames CtxB (listForeach I L Body) NB CtxB'
Mems : mems X CtxB'
SNA1 : exprNames CtxA' L NL *
SNA2 : stmtNames ([I]::CtxA') Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
============================
 mems X CtxA'
 < SNB: case SNB.

Subgoal 3.14:

Variables: NA CtxA' NB CtxB' X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (listForeach I L Body)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA'
SNA : stmtNames CtxA' (listForeach I L Body) NA CtxA' @
Mems : mems X CtxB'
SNA1 : exprNames CtxA' L NL *
SNA2 : stmtNames ([I]::CtxA') Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
SNB : exprNames CtxB' L NL1
SNB1 : stmtNames ([I]::CtxB') Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
============================
 mems X CtxA'
 < backchain RelBA.

Subgoal 4.22:

Variables: CtxA CtxB Ty
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsE : is_expr (nil Ty)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (nil Ty) [] @
============================
 exprNames CtxB (nil Ty) []
 < search.

Subgoal 4.23:

Variables: CtxA CtxB N N2 N3 E2 E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsE : is_expr (cons E1 E2)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (cons E1 E2) N @
EN1 : exprNames CtxA E1 N2 *
EN2 : exprNames CtxA E2 N3 *
EN3 : N2 ++ N3 = N
============================
 exprNames CtxB (cons E1 E2) N
 < case IsE.

Subgoal 4.23:

Variables: CtxA CtxB N N2 N3 E2 E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (cons E1 E2) N @
EN1 : exprNames CtxA E1 N2 *
EN2 : exprNames CtxA E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
============================
 exprNames CtxB (cons E1 E2) N
 < apply IH_E to _ _ _ RelAB RelBA EN1.

Subgoal 4.23:

Variables: CtxA CtxB N N2 N3 E2 E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (cons E1 E2) N @
EN1 : exprNames CtxA E1 N2 *
EN2 : exprNames CtxA E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : exprNames CtxB E1 N2
============================
 exprNames CtxB (cons E1 E2) N
 < apply IH_E to _ _ _ RelAB RelBA EN2.

Subgoal 4.23:

Variables: CtxA CtxB N N2 N3 E2 E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (cons E1 E2) N @
EN1 : exprNames CtxA E1 N2 *
EN2 : exprNames CtxA E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : exprNames CtxB E1 N2
H4 : exprNames CtxB E2 N3
============================
 exprNames CtxB (cons E1 E2) N
 < search.

Subgoal 4.24:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsE : is_expr (head E1)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (head E1) N @
EN1 : exprNames CtxA E1 N *
============================
 exprNames CtxB (head E1) N
 < case IsE.

Subgoal 4.24:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (head E1) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
============================
 exprNames CtxB (head E1) N
 < apply IH_E to _ _ _ RelAB RelBA EN1.

Subgoal 4.24:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (head E1) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
H2 : exprNames CtxB E1 N
============================
 exprNames CtxB (head E1) N
 < search.

Subgoal 4.25:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsE : is_expr (tail E1)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (tail E1) N @
EN1 : exprNames CtxA E1 N *
============================
 exprNames CtxB (tail E1) N
 < case IsE.

Subgoal 4.25:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (tail E1) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
============================
 exprNames CtxB (tail E1) N
 < apply IH_E to _ _ _ RelAB RelBA EN1.

Subgoal 4.25:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (tail E1) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
H2 : exprNames CtxB E1 N
============================
 exprNames CtxB (tail E1) N
 < search.

Subgoal 4.26:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsE : is_expr (null E1)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (null E1) N @
EN1 : exprNames CtxA E1 N *
============================
 exprNames CtxB (null E1) N
 < case IsE.

Subgoal 4.26:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (null E1) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
============================
 exprNames CtxB (null E1) N
 < apply IH_E to _ _ _ RelAB RelBA EN1.

Subgoal 4.26:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (null E1) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
H2 : exprNames CtxB E1 N
============================
 exprNames CtxB (null E1) N
 < search.

Subgoal 4.27:

Variables: CtxA CtxB N N2 N3 E2 E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsE : is_expr (index E1 E2)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (index E1 E2) N @
EN1 : exprNames CtxA E1 N2 *
EN2 : exprNames CtxA E2 N3 *
EN3 : N2 ++ N3 = N
============================
 exprNames CtxB (index E1 E2) N
 < case IsE.

Subgoal 4.27:

Variables: CtxA CtxB N N2 N3 E2 E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (index E1 E2) N @
EN1 : exprNames CtxA E1 N2 *
EN2 : exprNames CtxA E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
============================
 exprNames CtxB (index E1 E2) N
 < apply IH_E to _ _ _ RelAB RelBA EN1.

Subgoal 4.27:

Variables: CtxA CtxB N N2 N3 E2 E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (index E1 E2) N @
EN1 : exprNames CtxA E1 N2 *
EN2 : exprNames CtxA E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : exprNames CtxB E1 N2
============================
 exprNames CtxB (index E1 E2) N
 < apply IH_E to _ _ _ RelAB RelBA EN2.

Subgoal 4.27:

Variables: CtxA CtxB N N2 N3 E2 E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (index E1 E2) N @
EN1 : exprNames CtxA E1 N2 *
EN2 : exprNames CtxA E2 N3 *
EN3 : N2 ++ N3 = N
H1 : is_expr E1
H2 : is_expr E2
H3 : exprNames CtxB E1 N2
H4 : exprNames CtxB E2 N3
============================
 exprNames CtxB (index E1 E2) N
 < search.

Subgoal 4.28:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsE : is_expr (exactEval:list:length E1)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (exactEval:list:length E1) N @
EN1 : exprNames CtxA E1 N *
============================
 exprNames CtxB (exactEval:list:length E1) N
 < case IsE.

Subgoal 4.28:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (exactEval:list:length E1) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
============================
 exprNames CtxB (exactEval:list:length E1) N
 < apply IH_E to _ _ _ RelAB RelBA EN1.

Subgoal 4.28:

Variables: CtxA CtxB N E1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (exactEval:list:length E1) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
H2 : exprNames CtxB E1 N
============================
 exprNames CtxB (exactEval:list:length E1) N
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_increaseCtxs,
         exactEval:host:stmtNames_increaseCtxs_ctxs,
         exactEval:host:exprNames_increaseCtxs.

Subgoal 1.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NI NE E I L
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB'
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
============================
 mem X NA
 < case IsS.

Subgoal 1.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NI NE E I L
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB'
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 mem X NA
 < SNB: case SNB.

Subgoal 1.12.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 mem X NA
 < Or: apply mem_append to M SNB3.

Subgoal 1.12.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
Or : mem X NI1 \/ mem X NE1
============================
 mem X NA
 < M': case Or.

Subgoal 1.12.1.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NI1
============================
 mem X NA
 < MI: apply IH_E to _ _ _ _ SNA2 SNB1 M'.

Subgoal 1.12.1.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NI1
MI : mem X NI
============================
 mem X NA
 < apply mem_append_left to MI SNA4.

Subgoal 1.12.1.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NI1
MI : mem X NI
H4 : mem X NA
============================
 mem X NA
 < search.

Subgoal 1.12.1.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NE1
============================
 mem X NA
 < MN: apply IH_E to _ _ _ _ SNA3 SNB2 M'.

Subgoal 1.12.1.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NE1
MN : mem X NE
============================
 mem X NA
 < apply mem_append_right to MN SNA4.

Subgoal 1.12.1.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NE1
MN : mem X NE
H4 : mem X NA
============================
 mem X NA
 < search.

Subgoal 1.12.2:

Variables: ScopeA CtxA NA ScopeB CtxB X NI NE E I L NI1 NE1 N
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X (L::N)
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N
============================
 mem X NA
 < MB: apply RelAB to SNA1.

Subgoal 1.12.2:

Variables: ScopeA CtxA NA ScopeB CtxB X NI NE E I L NI1 NE1 N
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mem X (L::N)
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N
MB : mems L (ScopeB::CtxB)
============================
 mem X NA
 < apply not_mems to SNB MB.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X NI NE N L E I
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB'
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
============================
 mem X (L::N)
 < case IsS.

Subgoal 1.13:

Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X NI NE N L E I
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB'
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 mem X (L::N)
 < SNB: case SNB.

Subgoal 1.13.1:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 mem X (L::N)
 < Or: apply mem_append to M SNB3.

Subgoal 1.13.1:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
Or : mem X NI1 \/ mem X NE1
============================
 mem X (L::N)
 < M': case Or.

Subgoal 1.13.1.1:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NI1
============================
 mem X (L::N)
 < MI: apply IH_E to _ _ _ _ SNA2 SNB1 M'.

Subgoal 1.13.1.1:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NI1
MI : mem X NI
============================
 mem X (L::N)
 < apply mem_append_left to MI SNA4.

Subgoal 1.13.1.1:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NI1
MI : mem X NI
H4 : mem X N
============================
 mem X (L::N)
 < search.

Subgoal 1.13.1.2:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NE1
============================
 mem X (L::N)
 < MN: apply IH_E to _ _ _ _ SNA3 SNB2 M'.

Subgoal 1.13.1.2:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NE1
MN : mem X NE
============================
 mem X (L::N)
 < apply mem_append_right to MN SNA4.

Subgoal 1.13.1.2:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X NB
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
M' : mem X NE1
MN : mem X NE
H4 : mem X N
============================
 mem X (L::N)
 < search.

Subgoal 1.13.2:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mem X (L::N1)
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 mem X (L::N)
 < M: case M.

Subgoal 1.13.2.1:

Variables: ScopeA CtxA ScopeB CtxB NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 mem L (L::N)
 < search.

Subgoal 1.13.2.2:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
M : mem X N1
============================
 mem X (L::N)
 < Or: apply mem_append to M SNB3.

Subgoal 1.13.2.2:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
M : mem X N1
Or : mem X NI1 \/ mem X NE1
============================
 mem X (L::N)
 < M': case Or.

Subgoal 1.13.2.2.1:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
M : mem X N1
M' : mem X NI1
============================
 mem X (L::N)
 < MI: apply IH_E to _ _ _ _ SNA2 SNB1 M'.

Subgoal 1.13.2.2.1:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
M : mem X N1
M' : mem X NI1
MI : mem X NI
============================
 mem X (L::N)
 < apply mem_append_left to MI SNA4.

Subgoal 1.13.2.2.1:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
M : mem X N1
M' : mem X NI1
MI : mem X NI
H4 : mem X N
============================
 mem X (L::N)
 < search.

Subgoal 1.13.2.2.2:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
M : mem X N1
M' : mem X NE1
============================
 mem X (L::N)
 < MN: apply IH_E to _ _ _ _ SNA3 SNB2 M'.

Subgoal 1.13.2.2.2:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
M : mem X N1
M' : mem X NE1
MN : mem X NE
============================
 mem X (L::N)
 < apply mem_append_right to MN SNA4.

Subgoal 1.13.2.2.2:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
M : mem X N1
M' : mem X NE1
MN : mem X NE
H4 : mem X N
============================
 mem X (L::N)
 < search.

Subgoal 1.14:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NL NB1 Ctx1 Body L I
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (listForeach I L Body)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listForeach I L Body) NB CtxB'
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
============================
 mem X NA
 < case IsS.

Subgoal 1.14:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NL NB1 Ctx1 Body L I
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listForeach I L Body) NB CtxB'
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
============================
 mem X NA
 < SNB: case SNB.

Subgoal 1.14:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
============================
 mem X NA
 < Or: apply mem_append to M SNB2.

Subgoal 1.14:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
Or : mem X NL1 \/ mem X NB2
============================
 mem X NA
 < M': case Or.

Subgoal 1.14.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NL1
============================
 mem X NA
 < M'': apply IH_E to _ _ _ _ SNA1 SNB M'.

Subgoal 1.14.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NL1
M'' : mem X NL
============================
 mem X NA
 < apply mem_append_left to M'' SNA3.

Subgoal 1.14.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NL1
M'' : mem X NL
H4 : mem X NA
============================
 mem X NA
 < search.

Subgoal 1.14.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
============================
 mem X NA
 < M'': apply IH_S to _ _ _ _ SNA2 SNB1 M'.

Subgoal 1.14.2.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
============================
 forall X1, mems X1 ([I]::(ScopeA::CtxA)) -> mems X1 ([I]::(ScopeB::CtxB))
 < intros Mems.

Subgoal 1.14.2.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
Mems : mems X1 ([I]::(ScopeA::CtxA))
============================
 mems X1 ([I]::(ScopeB::CtxB))
 < Mems: case Mems.

Subgoal 1.14.2.1.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
Mems : mem X1 [I]
============================
 mems X1 ([I]::(ScopeB::CtxB))
 < MX: case Mems.

Subgoal 1.14.2.1.1.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
============================
 mems I ([I]::(ScopeB::CtxB))
 < search.

Subgoal 1.14.2.1.1.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
MX : mem X1 []
============================
 mems X1 ([I]::(ScopeB::CtxB))
 < case MX.

Subgoal 1.14.2.1.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
Mems : mems X1 (ScopeA::CtxA)
============================
 mems X1 ([I]::(ScopeB::CtxB))
 < apply RelAB to Mems.

Subgoal 1.14.2.1.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2 X1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
Mems : mems X1 (ScopeA::CtxA)
H4 : mems X1 (ScopeB::CtxB)
============================
 mems X1 ([I]::(ScopeB::CtxB))
 < search.

Subgoal 1.14.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
M'' : mem X NB1
============================
 mem X NA
 < apply mem_append_right to M'' SNA3.

Subgoal 1.14.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : is_string I
H2 : is_expr L
H3 : is_stmt Body
SNB : exprNames (ScopeB::CtxB) L NL1
SNB1 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
SNB2 : NL1 ++ NB2 = NB
M' : mem X NB2
M'' : mem X NB1
H4 : mem X NA
============================
 mem X NA
 < search.

Subgoal 2.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NI NE E I L
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB'
M : mems X (ScopeA::CtxA)
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
============================
 mems X CtxB'
 < case IsS.

Subgoal 2.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NI NE E I L
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB'
M : mems X (ScopeA::CtxA)
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 mems X CtxB'
 < SNB: case SNB.

Subgoal 2.12.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NI NE E I L NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mems X (ScopeA::CtxA)
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 mems X (ScopeB::CtxB)
 < backchain RelAB.

Subgoal 2.12.2:

Variables: ScopeA CtxA NA ScopeB CtxB X NI NE E I L NI1 NE1 N
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) NA (ScopeA::CtxA) @
M : mems X (ScopeA::CtxA)
SNA1 : mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = NA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N
============================
 mems X (ScopeB::CtxB)
 < backchain RelAB.

Subgoal 2.13:

Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X NI NE N L E I
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (listUpdate L I E)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB'
M : mems X (ScopeA::CtxA)
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
============================
 mems X CtxB'
 < case IsS.

Subgoal 2.13:

Variables: ScopeA CtxA ScopeB CtxB NB CtxB' X NI NE N L E I
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listUpdate L I E) NB CtxB'
M : mems X (ScopeA::CtxA)
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 mems X CtxB'
 < SNB: case SNB.

Subgoal 2.13.1:

Variables: ScopeA CtxA ScopeB CtxB NB X NI NE N L E I NI1 NE1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mems X (ScopeA::CtxA)
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = NB
============================
 mems X (ScopeB::CtxB)
 < backchain RelAB.

Subgoal 2.13.2:

Variables: ScopeA CtxA ScopeB CtxB X NI NE N L E I NI1 NE1 N1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listUpdate L I E) (L::N) (ScopeA::CtxA) @
M : mems X (ScopeA::CtxA)
SNA1 : not_mems L (ScopeA::CtxA)
SNA2 : exprNames (ScopeA::CtxA) I NI *
SNA3 : exprNames (ScopeA::CtxA) E NE *
SNA4 : NI ++ NE = N
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SNB : not_mems L (ScopeB::CtxB)
SNB1 : exprNames (ScopeB::CtxB) I NI1
SNB2 : exprNames (ScopeB::CtxB) E NE1
SNB3 : NI1 ++ NE1 = N1
============================
 mems X (ScopeB::CtxB)
 < backchain RelAB.

Subgoal 2.14:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NL NB1 Ctx1 Body L I
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (listForeach I L Body)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (listForeach I L Body) NB CtxB'
M : mems X (ScopeA::CtxA)
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
============================
 mems X CtxB'
 < case SNB.

Subgoal 2.14:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NL NB1 Ctx1 Body L I NL1 NB2 Ctx2
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (listForeach I L Body)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (listForeach I L Body) NA (ScopeA::CtxA) @
M : mems X (ScopeA::CtxA)
SNA1 : exprNames (ScopeA::CtxA) L NL *
SNA2 : stmtNames ([I]::(ScopeA::CtxA)) Body NB1 Ctx1 *
SNA3 : NL ++ NB1 = NA
H1 : exprNames (ScopeB::CtxB) L NL1
H2 : stmtNames ([I]::(ScopeB::CtxB)) Body NB2 Ctx2
H3 : NL1 ++ NB2 = NB
============================
 mems X (ScopeB::CtxB)
 < backchain RelAB.

Subgoal 3.22:

Variables: CtxA CtxB NB X Ty
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsE : is_expr (nil Ty)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (nil Ty) [] @
ENB : exprNames CtxB (nil Ty) NB
M : mem X NB
============================
 mem X []
 < case ENB.

Subgoal 3.22:

Variables: CtxA CtxB X Ty
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsE : is_expr (nil Ty)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (nil Ty) [] @
M : mem X []
============================
 mem X []
 < case M.

Subgoal 3.23:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsE : is_expr (cons E1 E2)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
ENB : exprNames CtxB (cons E1 E2) NB
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
============================
 mem X NA
 < case IsE.

Subgoal 3.23:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
ENB : exprNames CtxB (cons E1 E2) NB
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
============================
 mem X NA
 < ENB: case ENB.

Subgoal 3.23:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
============================
 mem X NA
 < Or: apply mem_append to M ENB2.

Subgoal 3.23:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
Or : mem X N3 \/ mem X N4
============================
 mem X NA
 < M': case Or.

Subgoal 3.23.1:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N3
============================
 mem X NA
 < M1: apply IH_E to _ _ _ _ ENA1 ENB M'.

Subgoal 3.23.1:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N3
M1 : mem X N1
============================
 mem X NA
 < apply mem_append_left to M1 ENA3.

Subgoal 3.23.1:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N3
M1 : mem X N1
H3 : mem X NA
============================
 mem X NA
 < search.

Subgoal 3.23.2:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N4
============================
 mem X NA
 < M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'.

Subgoal 3.23.2:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N4
M2 : mem X N2
============================
 mem X NA
 < apply mem_append_right to M2 ENA3.

Subgoal 3.23.2:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (cons E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N4
M2 : mem X N2
H3 : mem X NA
============================
 mem X NA
 < search.

Subgoal 3.24:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsE : is_expr (head E1)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (head E1) NA @
ENB : exprNames CtxB (head E1) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
============================
 mem X NA
 < case IsE.

Subgoal 3.24:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (head E1) NA @
ENB : exprNames CtxB (head E1) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
============================
 mem X NA
 < ENB: case ENB.

Subgoal 3.24:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (head E1) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
ENB : exprNames CtxB E1 NB
============================
 mem X NA
 < apply IH_E to _ _ _ _ ENA1 ENB M.

Subgoal 3.24:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (head E1) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
ENB : exprNames CtxB E1 NB
H2 : mem X NA
============================
 mem X NA
 < search.

Subgoal 3.25:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsE : is_expr (tail E1)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (tail E1) NA @
ENB : exprNames CtxB (tail E1) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
============================
 mem X NA
 < case IsE.

Subgoal 3.25:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (tail E1) NA @
ENB : exprNames CtxB (tail E1) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
============================
 mem X NA
 < ENB: case ENB.

Subgoal 3.25:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (tail E1) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
ENB : exprNames CtxB E1 NB
============================
 mem X NA
 < apply IH_E to _ _ _ _ ENA1 ENB M.

Subgoal 3.25:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (tail E1) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
ENB : exprNames CtxB E1 NB
H2 : mem X NA
============================
 mem X NA
 < search.

Subgoal 3.26:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsE : is_expr (null E1)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (null E1) NA @
ENB : exprNames CtxB (null E1) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
============================
 mem X NA
 < case IsE.

Subgoal 3.26:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (null E1) NA @
ENB : exprNames CtxB (null E1) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
============================
 mem X NA
 < ENB: case ENB.

Subgoal 3.26:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (null E1) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
ENB : exprNames CtxB E1 NB
============================
 mem X NA
 < apply IH_E to _ _ _ _ ENA1 ENB M.

Subgoal 3.26:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (null E1) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
ENB : exprNames CtxB E1 NB
H2 : mem X NA
============================
 mem X NA
 < search.

Subgoal 3.27:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsE : is_expr (index E1 E2)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
ENB : exprNames CtxB (index E1 E2) NB
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
============================
 mem X NA
 < case IsE.

Subgoal 3.27:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
ENB : exprNames CtxB (index E1 E2) NB
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
============================
 mem X NA
 < ENB: case ENB.

Subgoal 3.27:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
============================
 mem X NA
 < Or: apply mem_append to M ENB2.

Subgoal 3.27:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
Or : mem X N3 \/ mem X N4
============================
 mem X NA
 < M': case Or.

Subgoal 3.27.1:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N3
============================
 mem X NA
 < M1: apply IH_E to _ _ _ _ ENA1 ENB M'.

Subgoal 3.27.1:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N3
M1 : mem X N1
============================
 mem X NA
 < apply mem_append_left to M1 ENA3.

Subgoal 3.27.1:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N3
M1 : mem X N1
H3 : mem X NA
============================
 mem X NA
 < search.

Subgoal 3.27.2:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N4
============================
 mem X NA
 < M2: apply IH_E to _ _ _ _ ENA2 ENB1 M'.

Subgoal 3.27.2:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N4
M2 : mem X N2
============================
 mem X NA
 < apply mem_append_right to M2 ENA3.

Subgoal 3.27.2:

Variables: CtxA NA CtxB NB X N1 N2 E2 E1 N3 N4
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (index E1 E2) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 N1 *
ENA2 : exprNames CtxA E2 N2 *
ENA3 : N1 ++ N2 = NA
H1 : is_expr E1
H2 : is_expr E2
ENB : exprNames CtxB E1 N3
ENB1 : exprNames CtxB E2 N4
ENB2 : N3 ++ N4 = NB
M' : mem X N4
M2 : mem X N2
H3 : mem X NA
============================
 mem X NA
 < search.

Subgoal 3.28:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsE : is_expr (exactEval:list:length E1)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (exactEval:list:length E1) NA @
ENB : exprNames CtxB (exactEval:list:length E1) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
============================
 mem X NA
 < case IsE.

Subgoal 3.28:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (exactEval:list:length E1) NA @
ENB : exprNames CtxB (exactEval:list:length E1) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
============================
 mem X NA
 < ENB: case ENB.

Subgoal 3.28:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (exactEval:list:length E1) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
ENB : exprNames CtxB E1 NB
============================
 mem X NA
 < apply IH_E to _ _ _ _ ENA1 ENB M.

Subgoal 3.28:

Variables: CtxA NA CtxB NB X E1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (exactEval:list:length E1) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
ENB : exprNames CtxB E1 NB
H2 : mem X NA
============================
 mem X NA
 < search.

Proof completed.
 < Theorem exprNames_mem :
     forall Ctx X N, mems X Ctx -> exprNames Ctx (name X) N -> N = [].

============================
 forall Ctx X N, mems X Ctx -> exprNames Ctx (name X) N -> N = []
 < intros M EN.

Variables: Ctx X N
M : mems X Ctx
EN : exprNames Ctx (name X) N
============================
 N = []
 < EN: case EN.

Subgoal 1:

Variables: Ctx X
M : mems X Ctx
EN : mems X Ctx
============================
 [] = []
 < search.

Subgoal 2:

Variables: Ctx X
M : mems X Ctx
EN : not_mems X Ctx
============================
 [X] = []
 < apply not_mems to EN M.

Proof completed.
 < Prove_Constraint exactEval:host:proj_exprNames.

Subgoal 1:

Variables: Names Ctx N N_P X Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (nil Ty) N
EN_P : exprNames Ctx (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) N_P
M : mem X N_P
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 1:

Variables: Names Ctx N N_P X Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (nil Ty) N
M : mem X N_P
EN_P : recFieldNames Ctx (consRecFieldExprs "null" true nilRecFieldExprs) N_P
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 1:

Variables: Names Ctx N N_P X Ty EN RN
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (nil Ty) N
M : mem X N_P
EN_P : exprNames Ctx true EN
EN_P1 : recFieldNames Ctx nilRecFieldExprs RN
EN_P2 : EN ++ RN = N_P
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 1:

Variables: Names Ctx N N_P X Ty RN
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (nil Ty) N
M : mem X N_P
EN_P1 : recFieldNames Ctx nilRecFieldExprs RN
EN_P2 : [] ++ RN = N_P
============================
 mem X N
 < EN_P: case EN_P1.

Subgoal 1:

Variables: Names Ctx N N_P X Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (nil Ty) N
M : mem X N_P
EN_P2 : [] ++ [] = N_P
============================
 mem X N
 < case EN_P2.

Subgoal 1:

Variables: Names Ctx N X Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
IsE : is_expr (nil Ty)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (nil Ty) N
M : mem X []
============================
 mem X N
 < case M.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsE : is_expr (cons E1 E2)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N
EN_P : exprNames Ctx (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) N_P
M : mem X N_P
============================
 mem X N
 < case IsE.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (cons E1 E2) N
EN_P : exprNames Ctx (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) N_P
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
============================
 mem X N
 < EN: case EN.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) N_P
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P : recFieldNames Ctx (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) N_P
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3 EN RN
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P : exprNames Ctx false EN
EN_P1 : recFieldNames Ctx (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) RN
EN_P2 : EN ++ RN = N_P
============================
 mem X N
 < EN_P: case EN_P1.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3 EN RN EN1 RN1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P : exprNames Ctx false EN
EN_P2 : EN ++ RN = N_P
EN_P1 : exprNames Ctx E1 EN1
EN_P3 : recFieldNames Ctx (consRecFieldExprs "tail" E2 nilRecFieldExprs) RN1
EN_P4 : EN1 ++ RN1 = RN
============================
 mem X N
 < EN_P: case EN_P3.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3 EN RN EN1 RN1 EN2 RN2
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P : exprNames Ctx false EN
EN_P2 : EN ++ RN = N_P
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = RN
EN_P3 : exprNames Ctx E2 EN2
EN_P5 : recFieldNames Ctx nilRecFieldExprs RN2
EN_P6 : EN2 ++ RN2 = RN1
============================
 mem X N
 < case EN_P.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3 RN EN1 RN1 EN2 RN2
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P2 : [] ++ RN = N_P
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = RN
EN_P3 : exprNames Ctx E2 EN2
EN_P5 : recFieldNames Ctx nilRecFieldExprs RN2
EN_P6 : EN2 ++ RN2 = RN1
============================
 mem X N
 < case EN_P5.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3 RN EN1 RN1 EN2
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P2 : [] ++ RN = N_P
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = RN
EN_P3 : exprNames Ctx E2 EN2
EN_P6 : EN2 ++ [] = RN1
============================
 mem X N
 < case EN_P2.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3 EN1 RN1 EN2
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = N_P
EN_P3 : exprNames Ctx E2 EN2
EN_P6 : EN2 ++ [] = RN1
============================
 mem X N
 < apply append_nil_right to EN_P6.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3 EN1 RN1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = N_P
EN_P3 : exprNames Ctx E2 RN1
EN_P6 : RN1 ++ [] = RN1
============================
 mem X N
 < clear EN_P6.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N2 N3 EN1 RN1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = N_P
EN_P3 : exprNames Ctx E2 RN1
============================
 mem X N
 < apply exprNames_unique to _ _ EN EN_P1.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 N3 EN1 RN1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 EN1
EN1 : exprNames Ctx E2 N3
EN2 : EN1 ++ N3 = N
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = N_P
EN_P3 : exprNames Ctx E2 RN1
============================
 mem X N
 < apply exprNames_unique to _ _ EN1 EN_P3.

Subgoal 2:

Variables: Names Ctx N N_P X E2 E1 EN1 RN1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 EN1
EN1 : exprNames Ctx E2 RN1
EN2 : EN1 ++ RN1 = N
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = N_P
EN_P3 : exprNames Ctx E2 RN1
============================
 mem X N
 < apply append_unique to EN2 EN_P4.

Subgoal 2:

Variables: Names Ctx N_P X E2 E1 EN1 RN1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 EN1
EN1 : exprNames Ctx E2 RN1
EN2 : EN1 ++ RN1 = N_P
EN_P1 : exprNames Ctx E1 EN1
EN_P4 : EN1 ++ RN1 = N_P
EN_P3 : exprNames Ctx E2 RN1
============================
 mem X N_P
 < search.

Subgoal 3:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
IsE : is_expr (null E1)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (null E1) N
EN_P : exprNames Ctx (recFieldAccess E1 "null") N_P
M : mem X N_P
============================
 mem X N
 < case IsE.

Subgoal 3:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (null E1) N
EN_P : exprNames Ctx (recFieldAccess E1 "null") N_P
M : mem X N_P
H1 : is_expr E1
============================
 mem X N
 < EN: case EN.

Subgoal 3:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx (recFieldAccess E1 "null") N_P
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 3:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P : exprNames Ctx E1 N_P
============================
 mem X N
 < apply exprNames_unique to _ _ EN EN_P.

Subgoal 3:

Variables: Names Ctx N_P X E1
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N_P
EN_P : exprNames Ctx E1 N_P
============================
 mem X N_P
 < search.

Subgoal 4:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
IsE : is_expr (head E1)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (head E1) N
EN_P : exprNames Ctx (recFieldAccess E1 "head") N_P
M : mem X N_P
============================
 mem X N
 < case IsE.

Subgoal 4:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (head E1) N
EN_P : exprNames Ctx (recFieldAccess E1 "head") N_P
M : mem X N_P
H1 : is_expr E1
============================
 mem X N
 < EN: case EN.

Subgoal 4:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx (recFieldAccess E1 "head") N_P
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 4:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P : exprNames Ctx E1 N_P
============================
 mem X N
 < apply exprNames_unique to _ _ EN EN_P.

Subgoal 4:

Variables: Names Ctx N_P X E1
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N_P
EN_P : exprNames Ctx E1 N_P
============================
 mem X N_P
 < search.

Subgoal 5:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
IsE : is_expr (tail E1)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (tail E1) N
EN_P : exprNames Ctx (recFieldAccess E1 "tail") N_P
M : mem X N_P
============================
 mem X N
 < case IsE.

Subgoal 5:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (tail E1) N
EN_P : exprNames Ctx (recFieldAccess E1 "tail") N_P
M : mem X N_P
H1 : is_expr E1
============================
 mem X N
 < EN: case EN.

Subgoal 5:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx (recFieldAccess E1 "tail") N_P
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 5:

Variables: Names Ctx N N_P X E1
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P : exprNames Ctx E1 N_P
============================
 mem X N
 < apply exprNames_unique to _ _ EN EN_P.

Subgoal 5:

Variables: Names Ctx N_P X E1
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
H1 : is_expr E1
EN : exprNames Ctx E1 N_P
EN_P : exprNames Ctx E1 N_P
============================
 mem X N_P
 < search.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsE : is_expr (index Lst Index)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index Lst Index) N
EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) N_P
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
============================
 mem X N
 < case IsE.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (index Lst Index) N
EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) N_P
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
============================
 mem X N
 < EN: case EN.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) N_P
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P : stmtNames ([]::Ctx) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) NS CtxS
EN_P1 : exprNames CtxS (recFieldAccess (name SaveL) "head") NE
EN_P2 : NS ++ NE = N_P
============================
 mem X N
 < EN_P: case EN_P1.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P : stmtNames ([]::Ctx) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) NS CtxS
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 Ctx3 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P : stmtNames ([]::Ctx) (declare intTy SaveL Lst) N1 Ctx3
EN_P3 : stmtNames Ctx3 (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))))) N4 CtxS
EN_P4 : N1 ++ N4 = NS
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P3 : stmtNames ([SaveL]::Ctx) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))))) N4 CtxS
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
============================
 mem X N
 < EN_P: case EN_P3.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 Ctx1 N6
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : stmtNames ([SaveL]::Ctx) (declare intTy SaveI Index) N5 Ctx1
EN_P5 : stmtNames Ctx1 (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) N6 CtxS
EN_P6 : N5 ++ N6 = N4
============================
 mem X N
 < EN_P: case EN_P3.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P5 : stmtNames ([SaveI, SaveL]::Ctx) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) N6 CtxS
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 Ctx2 N8
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P5 : stmtNames ([SaveI, SaveL]::Ctx) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) N7 Ctx2
EN_P7 : stmtNames Ctx2 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN CtxT FN CtxF N9
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (num 0) (name SaveI)) CN
EN_P9 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (printVal (errorExpr (stringLit "Die") intTy)) TN CtxT
EN_P10 : stmtNames ([]::([SaveI, SaveL]::Ctx)) noop FN CtxF
EN_P11 : CN ++ TN = N9
EN_P12 : N9 ++ FN = N7
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN CtxT FN CtxF N9 N10 N11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P9 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (printVal (errorExpr (stringLit "Die") intTy)) TN CtxT
EN_P10 : stmtNames ([]::([SaveI, SaveL]::Ctx)) noop FN CtxF
EN_P11 : CN ++ TN = N9
EN_P12 : N9 ++ FN = N7
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (num 0) N10
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11
EN_P14 : N10 ++ N11 = CN
============================
 mem X N
 < case EN_P5.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN CtxT FN CtxF N9 N11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P9 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (printVal (errorExpr (stringLit "Die") intTy)) TN CtxT
EN_P10 : stmtNames ([]::([SaveI, SaveL]::Ctx)) noop FN CtxF
EN_P11 : CN ++ TN = N9
EN_P12 : N9 ++ FN = N7
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11
EN_P14 : [] ++ N11 = CN
============================
 mem X N
 < case EN_P10.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN CtxT N9 N11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P9 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (printVal (errorExpr (stringLit "Die") intTy)) TN CtxT
EN_P11 : CN ++ TN = N9
EN_P12 : N9 ++ [] = N7
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11
EN_P14 : [] ++ N11 = CN
============================
 mem X N
 < EN_P: case EN_P9.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN N9 N11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P11 : CN ++ TN = N9
EN_P12 : N9 ++ [] = N7
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11
EN_P14 : [] ++ N11 = CN
EN_P5 : exprNames ([]::([SaveI, SaveL]::Ctx)) (errorExpr (stringLit "Die") intTy) TN
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN TN N9 N11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P11 : CN ++ TN = N9
EN_P12 : N9 ++ [] = N7
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11
EN_P14 : [] ++ N11 = CN
EN_P5 : exprNames ([]::([SaveI, SaveL]::Ctx)) (stringLit "Die") TN
============================
 mem X N
 < case EN_P5.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN N9 N11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P11 : CN ++ [] = N9
EN_P12 : N9 ++ [] = N7
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N11
EN_P14 : [] ++ N11 = CN
============================
 mem X N
 < case EN_P14.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 CN N9
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P11 : CN ++ [] = N9
EN_P12 : N9 ++ [] = N7
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) CN
============================
 mem X N
 < apply append_nil_right to EN_P11.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8 N9
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P11 : N9 ++ [] = N9
EN_P12 : N9 ++ [] = N7
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N9
============================
 mem X N
 < apply append_nil_right to EN_P12.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P11 : N7 ++ [] = N7
EN_P12 : N7 ++ [] = N7
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7
============================
 mem X N
 < clear EN_P11
   EN_P12.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS CtxS NE N1 N4 N5 N6 N7 N8
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames CtxS (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([SaveI, SaveL]::Ctx) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) N8 CtxS
EN_P8 : N7 ++ N8 = N6
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7
============================
 mem X N
 < EN_P: case EN_P7.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS NE N1 N4 N5 N6 N7 N8 CN1 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ NE = N_P
EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveL) NE
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P8 : N7 ++ N8 = N6
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N8
============================
 mem X N
 < apply exprNames_mem to _ EN_P1.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 NS N1 N4 N5 N6 N7 N8 CN1 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : NS ++ [] = N_P
EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveL) []
EN_P4 : N1 ++ N4 = NS
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P8 : N7 ++ N8 = N6
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N8
============================
 mem X N
 < apply append_nil_right to EN_P2.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N7 N8 CN1 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P2 : N_P ++ [] = N_P
EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveL) []
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P8 : N7 ++ N8 = N6
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N8
============================
 mem X N
 < clear EN_P1
   EN_P2.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N7 N8 CN1 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P8 : N7 ++ N8 = N6
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N7
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N8
============================
 mem X N
 < apply exprNames_mem to _ EN_P13.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N8 CN1 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P8 : [] ++ N8 = N6
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) []
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N8
============================
 mem X N
 < case EN_P8.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P13 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) []
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N6
============================
 mem X N
 < clear EN_P13.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P5 : exprNames ([SaveI, SaveL]::Ctx) (greater (name SaveI) (num 0)) CN1
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N6
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB N12 N13
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N6
EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N12
EN_P2 : exprNames ([SaveI, SaveL]::Ctx) (num 0) N13
EN_P5 : N12 ++ N13 = CN1
============================
 mem X N
 < case EN_P2.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB N12
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N6
EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) N12
EN_P5 : N12 ++ [] = CN1
============================
 mem X N
 < apply exprNames_mem to _ EN_P1.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CN1 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : CN1 ++ BN = N6
EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) []
EN_P5 : [] ++ [] = CN1
============================
 mem X N
 < case EN_P5.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 BN CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) BN CtxB
EN_P9 : [] ++ BN = N6
EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) []
============================
 mem X N
 < case EN_P9.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) N6 CtxB
EN_P1 : exprNames ([SaveI, SaveL]::Ctx) (name SaveI) []
============================
 mem X N
 < clear EN_P1.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P7 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))) N6 CtxB
============================
 mem X N
 < EN_P: case EN_P7.

Subgoal 6:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N14 Ctx4 N15
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P1 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N14 Ctx4
EN_P2 : stmtNames Ctx4 (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : N14 ++ N15 = N6
============================
 mem X N
 < EN_P: case EN_P1.

Subgoal 6.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N14 N15
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : N14 ++ N15 = N6
EN_P1 : mems SaveL ([]::([SaveI, SaveL]::Ctx))
EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N14
============================
 mem X N
 < clear EN_P1.

Subgoal 6.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N14 N15
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : N14 ++ N15 = N6
EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N14
============================
 mem X N
 < EN_P: case EN_P7.

Subgoal 6.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N14 N15
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : N14 ++ N15 = N6
EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveL) N14
============================
 mem X N
 < apply exprNames_mem to _ EN_P1.

Subgoal 6.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : [] ++ N15 = N6
EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveL) []
============================
 mem X N
 < case EN_P5.

Subgoal 6.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N6 CtxB
EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveL) []
============================
 mem X N
 < clear EN_P1.

Subgoal 6.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N6 CtxB
============================
 mem X N
 < EN_P: case EN_P2.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P1 : mems SaveI ([]::([SaveI, SaveL]::Ctx))
EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N6
============================
 mem X N
 < clear EN_P1.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N6
============================
 mem X N
 < EN_P: case EN_P2.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N16 N17
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveI) N16
EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (num 1) N17
EN_P5 : N16 ++ N17 = N6
============================
 mem X N
 < case EN_P2.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveI) N16
EN_P5 : N16 ++ [] = N6
============================
 mem X N
 < apply exprNames_mem to _ EN_P1.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveI) []
EN_P5 : [] ++ [] = N6
============================
 mem X N
 < case EN_P5.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ [] = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P1 : exprNames ([]::([SaveI, SaveL]::Ctx)) (name SaveI) []
============================
 mem X N
 < clear EN_P1.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ [] = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
============================
 mem X N
 < apply append_nil_right to EN_P6.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N4 ++ [] = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
============================
 mem X N
 < clear EN_P6.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
============================
 mem X N
 < Or: apply mem_append to M EN_P4.

Subgoal 6.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
Or : mem X N1 \/ mem X N4
============================
 mem X N
 < M': case Or.

Subgoal 6.1.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
M' : mem X N1
============================
 mem X N
 < M2: apply exprNames_increaseCtxs to _ _ _ _ EN EN_P M'.

Subgoal 6.1.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
M' : mem X N1
M2 : mem X N2
============================
 mem X N
 < apply mem_append_left to M2 EN2.

Subgoal 6.1.1.1:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
M' : mem X N1
M2 : mem X N2
H3 : mem X N
============================
 mem X N
 < search.

Subgoal 6.1.1.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
M' : mem X N4
============================
 mem X N
 < apply fresh_name_is to _ Pr2.

Subgoal 6.1.1.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
M' : mem X N4
H3 : is_string SaveL
============================
 mem X N
 < M3: apply exprNames_increaseCtxs to _ _ _ _ EN1 EN_P3 M'.

Subgoal 6.1.1.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
M' : mem X N4
H3 : is_string SaveL
M3 : mem X N3
============================
 mem X N
 < apply mem_append_right to M3 EN2.

Subgoal 6.1.1.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P3 : exprNames ([SaveL]::Ctx) Index N4
M' : mem X N4
H3 : is_string SaveL
M3 : mem X N3
H4 : mem X N
============================
 mem X N
 < search.

Subgoal 6.1.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ SaveI::N16 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P1 : not_mems SaveI ([]::([SaveI, SaveL]::Ctx))
EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N16
============================
 mem X N
 < NM: case EN_P1.

Subgoal 6.1.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ SaveI::N16 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N16
NM : not_mem SaveI []
NM1 : not_mems SaveI ([SaveI, SaveL]::Ctx)
============================
 mem X N
 < NM': case NM1.

Subgoal 6.1.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ SaveI::N16 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N16
NM : not_mem SaveI []
NM' : not_mem SaveI [SaveI, SaveL]
NM'1 : not_mems SaveI Ctx
============================
 mem X N
 < NM'': case NM'.

Subgoal 6.1.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ SaveI::N16 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : exprNames ([]::([SaveI, SaveL]::Ctx)) (minus (name SaveI) (num 1)) N16
NM : not_mem SaveI []
NM'1 : not_mems SaveI Ctx
NM'' : SaveI = SaveI -> false
NM''1 : not_mem SaveI [SaveL]
============================
 mem X N
 < apply NM'' to _.

Subgoal 6.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : SaveL::N16 ++ N15 = N6
EN_P1 : not_mems SaveL ([]::([SaveI, SaveL]::Ctx))
EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16
============================
 mem X N
 < NM: case EN_P1.

Subgoal 6.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : SaveL::N16 ++ N15 = N6
EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16
NM : not_mem SaveL []
NM1 : not_mems SaveL ([SaveI, SaveL]::Ctx)
============================
 mem X N
 < NM': case NM1.

Subgoal 6.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : SaveL::N16 ++ N15 = N6
EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16
NM : not_mem SaveL []
NM' : not_mem SaveL [SaveI, SaveL]
NM'1 : not_mems SaveL Ctx
============================
 mem X N
 < NM'': case NM'.

Subgoal 6.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : SaveL::N16 ++ N15 = N6
EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16
NM : not_mem SaveL []
NM'1 : not_mems SaveL Ctx
NM'' : SaveI = SaveL -> false
NM''1 : not_mem SaveL [SaveL]
============================
 mem X N
 < NM''': case NM''1.

Subgoal 6.2:

Variables: Names Ctx N N_P X SaveL SaveI Index Lst N2 N3 N1 N4 N5 N6 CtxB N15 N16
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N2
EN1 : exprNames Ctx Index N3
EN2 : N2 ++ N3 = N
EN_P4 : N1 ++ N4 = N_P
EN_P : exprNames ([]::Ctx) Lst N1
EN_P6 : N5 ++ N6 = N4
EN_P3 : exprNames ([SaveL]::Ctx) Index N5
EN_P2 : stmtNames ([]::([SaveI, SaveL]::Ctx)) (assign SaveI (minus (name SaveI) (num 1))) N15 CtxB
EN_P5 : SaveL::N16 ++ N15 = N6
EN_P7 : exprNames ([]::([SaveI, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N16
NM : not_mem SaveL []
NM'1 : not_mems SaveL Ctx
NM'' : SaveI = SaveL -> false
NM''' : SaveL = SaveL -> false
NM'''1 : not_mem SaveL []
============================
 mem X N
 < apply NM''' to _.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsE : is_expr (exactEval:list:length E1)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (exactEval:list:length E1) N
EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) N_P
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
============================
 mem X N
 < case IsE.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (exactEval:list:length E1) N
EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) N_P
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
============================
 mem X N
 < EN: case EN.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) N_P
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P : stmtNames ([]::Ctx) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) NS CtxS
EN_P1 : exprNames CtxS (name Len) NE
EN_P2 : NS ++ NE = N_P
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 Ctx3 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames CtxS (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P : stmtNames ([]::Ctx) (declare intTy SaveL E1) N2 Ctx3
EN_P3 : stmtNames Ctx3 (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))) N3 CtxS
EN_P4 : N2 ++ N3 = NS
============================
 mem X N
 < EN_P: case EN_P.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames CtxS (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P3 : stmtNames ([SaveL]::Ctx) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))) N3 CtxS
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
============================
 mem X N
 < EN_P: case EN_P3.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3 N1 Ctx1 N4
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames CtxS (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P3 : stmtNames ([SaveL]::Ctx) (declare intTy Len (num 0)) N1 Ctx1
EN_P5 : stmtNames Ctx1 (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) N4 CtxS
EN_P6 : N1 ++ N4 = N3
============================
 mem X N
 < EN_P: case EN_P3.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3 N1 N4
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames CtxS (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : stmtNames ([Len, SaveL]::Ctx) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) N4 CtxS
EN_P6 : N1 ++ N4 = N3
EN_P3 : exprNames ([SaveL]::Ctx) (num 0) N1
============================
 mem X N
 < case EN_P3.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3 N4
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames CtxS (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : stmtNames ([Len, SaveL]::Ctx) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) N4 CtxS
EN_P6 : [] ++ N4 = N3
============================
 mem X N
 < case EN_P6.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS CtxS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames CtxS (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : stmtNames ([Len, SaveL]::Ctx) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) N3 CtxS
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CN BN CtxB
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P3 : exprNames ([Len, SaveL]::Ctx) (not (recFieldAccess (name SaveL) "null")) CN
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))) BN CtxB
EN_P6 : CN ++ BN = N3
============================
 mem X N
 < EN_P: case EN_P3.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CN BN CtxB
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))) BN CtxB
EN_P6 : CN ++ BN = N3
EN_P3 : exprNames ([Len, SaveL]::Ctx) (recFieldAccess (name SaveL) "null") CN
============================
 mem X N
 < EN_P: case EN_P3.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CN BN CtxB
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))) BN CtxB
EN_P6 : CN ++ BN = N3
EN_P3 : exprNames ([Len, SaveL]::Ctx) (name SaveL) CN
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 7:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CN BN CtxB N5 Ctx2 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : CN ++ BN = N3
EN_P3 : exprNames ([Len, SaveL]::Ctx) (name SaveL) CN
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2
EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = BN
============================
 mem X N
 < M': case EN_P3.

Subgoal 7.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [] ++ BN = N3
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2
EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = BN
M' : mems SaveL ([Len, SaveL]::Ctx)
============================
 mem X N
 < clear M'.

Subgoal 7.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [] ++ BN = N3
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2
EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = BN
============================
 mem X N
 < case EN_P6.

Subgoal 7.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N5 Ctx2 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2
EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = N3
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 7.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N5 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = N3
EN_P3 : mems SaveL ([]::([Len, SaveL]::Ctx))
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N5
============================
 mem X N
 < clear EN_P3.

Subgoal 7.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N5 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = N3
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N5
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 7.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N5 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = N3
EN_P3 : exprNames ([]::([Len, SaveL]::Ctx)) (name SaveL) N5
============================
 mem X N
 < M': case EN_P3.

Subgoal 7.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : [] ++ N6 = N3
M' : mems SaveL ([]::([Len, SaveL]::Ctx))
============================
 mem X N
 < clear M'.

Subgoal 7.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : [] ++ N6 = N3
============================
 mem X N
 < case EN_P8.

Subgoal 7.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N3 CtxB
============================
 mem X N
 < EN_P: case EN_P7.

Subgoal 7.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P3 : mems Len ([]::([Len, SaveL]::Ctx))
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N3
============================
 mem X N
 < clear EN_P3.

Subgoal 7.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N3
============================
 mem X N
 < EN_P: case EN_P5.

Subgoal 7.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 N7 N8
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P3 : exprNames ([]::([Len, SaveL]::Ctx)) (name Len) N7
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (num 1) N8
EN_P6 : N7 ++ N8 = N3
============================
 mem X N
 < case EN_P5.

Subgoal 7.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P3 : exprNames ([]::([Len, SaveL]::Ctx)) (name Len) N7
EN_P6 : N7 ++ [] = N3
============================
 mem X N
 < EN_P: case EN_P3.

Subgoal 7.1.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [] ++ [] = N3
EN_P3 : mems Len ([]::([Len, SaveL]::Ctx))
============================
 mem X N
 < case EN_P6.

Subgoal 7.1.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ [] = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P3 : mems Len ([]::([Len, SaveL]::Ctx))
============================
 mem X N
 < apply append_nil_right to EN_P4.

Subgoal 7.1.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : NS ++ [] = NS
EN_P : exprNames ([]::Ctx) E1 NS
EN_P3 : mems Len ([]::([Len, SaveL]::Ctx))
============================
 mem X N
 < clear EN_P4
   EN_P3.

Subgoal 7.1.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P : exprNames ([]::Ctx) E1 NS
============================
 mem X N
 < M': case EN_P1.

Subgoal 7.1.1.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1 NS
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P2 : NS ++ [] = N_P
EN_P : exprNames ([]::Ctx) E1 NS
M' : mems Len ([Len, SaveL]::Ctx)
============================
 mem X N
 < apply append_nil_right to EN_P2.

Subgoal 7.1.1.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P2 : N_P ++ [] = N_P
EN_P : exprNames ([]::Ctx) E1 N_P
M' : mems Len ([Len, SaveL]::Ctx)
============================
 mem X N
 < apply exprNames_increaseCtxs to _ _ _ _ EN EN_P M.

Subgoal 7.1.1.1.1.1.1:

Variables: Names Ctx N N_P X Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P2 : N_P ++ [] = N_P
EN_P : exprNames ([]::Ctx) E1 N_P
M' : mems Len ([Len, SaveL]::Ctx)
H2 : mem X N
============================
 mem X N
 < search.

Subgoal 7.1.1.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P2 : NS ++ [Len] = N_P
EN_P : exprNames ([]::Ctx) E1 NS
M' : not_mems Len ([Len, SaveL]::Ctx)
============================
 mem X N
 < NM: case M'.

Subgoal 7.1.1.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P2 : NS ++ [Len] = N_P
EN_P : exprNames ([]::Ctx) E1 NS
NM : not_mem Len [Len, SaveL]
NM1 : not_mems Len Ctx
============================
 mem X N
 < NM': case NM.

Subgoal 7.1.1.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P2 : NS ++ [Len] = N_P
EN_P : exprNames ([]::Ctx) E1 NS
NM1 : not_mems Len Ctx
NM' : Len = Len -> false
NM'1 : not_mem Len [SaveL]
============================
 mem X N
 < apply NM' to _.

Subgoal 7.1.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [Len] ++ [] = N3
EN_P3 : not_mems Len ([]::([Len, SaveL]::Ctx))
============================
 mem X N
 < NM: case EN_P3.

Subgoal 7.1.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [Len] ++ [] = N3
NM : not_mem Len []
NM1 : not_mems Len ([Len, SaveL]::Ctx)
============================
 mem X N
 < NM': case NM1.

Subgoal 7.1.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [Len] ++ [] = N3
NM : not_mem Len []
NM' : not_mem Len [Len, SaveL]
NM'1 : not_mems Len Ctx
============================
 mem X N
 < NM'': case NM'.

Subgoal 7.1.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [Len] ++ [] = N3
NM : not_mem Len []
NM'1 : not_mems Len Ctx
NM'' : Len = Len -> false
NM''1 : not_mem Len [SaveL]
============================
 mem X N
 < apply NM'' to _.

Subgoal 7.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ Len::N7 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P3 : not_mems Len ([]::([Len, SaveL]::Ctx))
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N7
============================
 mem X N
 < NM: case EN_P3.

Subgoal 7.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ Len::N7 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N7
NM : not_mem Len []
NM1 : not_mems Len ([Len, SaveL]::Ctx)
============================
 mem X N
 < NM': case NM1.

Subgoal 7.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ Len::N7 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N7
NM : not_mem Len []
NM' : not_mem Len [Len, SaveL]
NM'1 : not_mems Len Ctx
============================
 mem X N
 < NM'': case NM'.

Subgoal 7.1.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ Len::N7 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (plus (name Len) (num 1)) N7
NM : not_mem Len []
NM'1 : not_mems Len Ctx
NM'' : Len = Len -> false
NM''1 : not_mem Len [SaveL]
============================
 mem X N
 < apply NM'' to _.

Subgoal 7.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : [SaveL] ++ N6 = N3
M' : not_mems SaveL ([]::([Len, SaveL]::Ctx))
============================
 mem X N
 < NM: case M'.

Subgoal 7.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : [SaveL] ++ N6 = N3
NM : not_mem SaveL []
NM1 : not_mems SaveL ([Len, SaveL]::Ctx)
============================
 mem X N
 < NM': case NM1.

Subgoal 7.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : [SaveL] ++ N6 = N3
NM : not_mem SaveL []
NM' : not_mem SaveL [Len, SaveL]
NM'1 : not_mems SaveL Ctx
============================
 mem X N
 < NM'': case NM'.

Subgoal 7.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : [SaveL] ++ N6 = N3
NM : not_mem SaveL []
NM'1 : not_mems SaveL Ctx
NM'' : Len = SaveL -> false
NM''1 : not_mem SaveL [SaveL]
============================
 mem X N
 < NM''': case NM''1.

Subgoal 7.1.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : [SaveL] ++ N6 = N3
NM : not_mem SaveL []
NM'1 : not_mems SaveL Ctx
NM'' : Len = SaveL -> false
NM''' : SaveL = SaveL -> false
NM'''1 : not_mem SaveL []
============================
 mem X N
 < apply NM''' to _.

Subgoal 7.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : SaveL::N7 ++ N6 = N3
EN_P3 : not_mems SaveL ([]::([Len, SaveL]::Ctx))
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7
============================
 mem X N
 < NM: case EN_P3.

Subgoal 7.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : SaveL::N7 ++ N6 = N3
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7
NM : not_mem SaveL []
NM1 : not_mems SaveL ([Len, SaveL]::Ctx)
============================
 mem X N
 < NM': case NM1.

Subgoal 7.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : SaveL::N7 ++ N6 = N3
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7
NM : not_mem SaveL []
NM' : not_mem SaveL [Len, SaveL]
NM'1 : not_mems SaveL Ctx
============================
 mem X N
 < NM'': case NM'.

Subgoal 7.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : SaveL::N7 ++ N6 = N3
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7
NM : not_mem SaveL []
NM'1 : not_mems SaveL Ctx
NM'' : Len = SaveL -> false
NM''1 : not_mem SaveL [SaveL]
============================
 mem X N
 < NM''': case NM''1.

Subgoal 7.1.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 CtxB N6 N7
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P7 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : SaveL::N7 ++ N6 = N3
EN_P5 : exprNames ([]::([Len, SaveL]::Ctx)) (recFieldAccess (name SaveL) "tail") N7
NM : not_mem SaveL []
NM'1 : not_mems SaveL Ctx
NM'' : Len = SaveL -> false
NM''' : SaveL = SaveL -> false
NM'''1 : not_mem SaveL []
============================
 mem X N
 < apply NM''' to _.

Subgoal 7.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [SaveL] ++ BN = N3
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2
EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = BN
M' : not_mems SaveL ([Len, SaveL]::Ctx)
============================
 mem X N
 < NM: case M'.

Subgoal 7.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [SaveL] ++ BN = N3
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2
EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = BN
NM : not_mem SaveL [Len, SaveL]
NM1 : not_mems SaveL Ctx
============================
 mem X N
 < NM': case NM.

Subgoal 7.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [SaveL] ++ BN = N3
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2
EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = BN
NM1 : not_mems SaveL Ctx
NM' : Len = SaveL -> false
NM'1 : not_mem SaveL [SaveL]
============================
 mem X N
 < NM'': case NM'1.

Subgoal 7.2:

Variables: Names Ctx N N_P X Len SaveL E1 NS NE N2 N3 BN CtxB N5 Ctx2 N6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
M : mem X N_P
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 N
EN_P1 : exprNames ([Len, SaveL]::Ctx) (name Len) NE
EN_P2 : NS ++ NE = N_P
EN_P4 : N2 ++ N3 = NS
EN_P : exprNames ([]::Ctx) E1 N2
EN_P6 : [SaveL] ++ BN = N3
EN_P5 : stmtNames ([]::([Len, SaveL]::Ctx)) (assign SaveL (recFieldAccess (name SaveL) "tail")) N5 Ctx2
EN_P7 : stmtNames Ctx2 (assign Len (plus (name Len) (num 1))) N6 CtxB
EN_P8 : N5 ++ N6 = BN
NM1 : not_mems SaveL Ctx
NM' : Len = SaveL -> false
NM'' : SaveL = SaveL -> false
NM''1 : not_mem SaveL []
============================
 mem X N
 < apply NM'' to _.

Proof completed.
 < Theorem mems_append_right  [X] :
     forall A B C (X : X), A ++ B = C -> mems X B -> mems X C.

============================
 forall A B C X, A ++ B = C -> mems X B -> mems X C
 < induction on 1.

IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C
============================
 forall A B C X, A ++ B = C @ -> mems X B -> mems X C
 < intros App M.

Variables: A B C X
IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C
App : A ++ B = C @
M : mems X B
============================
 mems X C
 < App: case App.

Subgoal 1:

Variables: C X
IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C
M : mems X C
============================
 mems X C
 < search.

Subgoal 2:

Variables: B X L3 H T
IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C
M : mems X B
App : T ++ B = L3 *
============================
 mems X (H::L3)
 < apply IH to App M.

Subgoal 2:

Variables: B X L3 H T
IH : forall A B C X, A ++ B = C * -> mems X B -> mems X C
M : mems X B
App : T ++ B = L3 *
H1 : mems X L3
============================
 mems X (H::L3)
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmtNames.

Subgoal 1:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
============================
 mem X N
 < case IsS.

Subgoal 1:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 mem X N
 < SN: case SN.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
============================
 mem X N
 < SN_P: case SN_P.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2
============================
 mem X N
 < SN_P: case SN_P.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 Ctx1 N3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P : stmtNames ([]::(Scope::Ctx)) (declare intTy SaveI I) N2 Ctx1
SN_P1 : stmtNames Ctx1 (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) N3 Ctx2
SN_P2 : N2 ++ N3 = N_P
============================
 mem X N
 < SN_PI: case SN_P.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P1 : stmtNames ([SaveI]::(Scope::Ctx)) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) N3 Ctx2
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 Ctx3 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P : stmtNames ([SaveI]::(Scope::Ctx)) (declare intTy SaveE E) N1 Ctx3
SN_P1 : stmtNames Ctx3 (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) N4 Ctx2
SN_P3 : N1 ++ N4 = N3
============================
 mem X N
 < SN_PE: case SN_P.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P1 : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) N4 Ctx2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 Ctx4 N6
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 Ctx4
SN_P1 : stmtNames Ctx4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) N6 Ctx2
SN_P4 : N5 ++ N6 = N4
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 Ctx4 N6 N7 Ctx5 N8
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 Ctx4
SN_P4 : N5 ++ N6 = N4
SN_P1 : stmtNames Ctx4 (declare intTy Hold (nil intTy)) N7 Ctx5
SN_P5 : stmtNames Ctx5 (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N8 Ctx2
SN_P6 : N7 ++ N8 = N6
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 N7 N8 Ctx6 Scope1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N8 Ctx2
SN_P6 : N7 ++ N8 = N6
SN_P1 : exprNames (Scope1::Ctx6) (nil intTy) N7
============================
 mem X N
 < case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 N8 Ctx6 Scope1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N8 Ctx2
SN_P6 : [] ++ N8 = N6
============================
 mem X N
 < case SN_P6.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N6 Ctx2
============================
 mem X N
 < SN_P: case SN_P5.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 Ctx7 N10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P1 : stmtNames ((Hold::Scope1)::Ctx6) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) N9 Ctx7
SN_P5 : stmtNames Ctx7 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) CN
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N9
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N9
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (not (eq (name SaveI) (num 0))) N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N12
SN_P10 : N11 ++ N12 = CN
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N9
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N12
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (eq (name SaveI) (num 0)) N11
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N9
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N12
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P11 : exprNames ((Hold::Scope1)::Ctx6) (num 0) N14
SN_P12 : N13 ++ N14 = N11
============================
 mem X N
 < case SN_P11.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N9
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N12
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
============================
 mem X N
 < SN_P: case SN_P9.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (null (name L)) N12
============================
 mem X N
 < SN_P: case SN_P9.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
============================
 mem X N
 < SN_P: case SN_P7.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 Ctx8 N16
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 Ctx8
SN_P11 : stmtNames Ctx8 (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))) N16 CtxB
SN_P13 : N15 ++ N16 = BN
============================
 mem X N
 < SN_P: case SN_P11.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 Ctx8 N16 N17 Ctx9 N18
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 Ctx8
SN_P13 : N15 ++ N16 = BN
SN_P11 : stmtNames Ctx8 (declare intTy Copy (name L)) N17 Ctx9
SN_P14 : stmtNames Ctx9 (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) N18 CtxB
SN_P15 : N17 ++ N18 = N16
============================
 mem X N
 < SN_P: case SN_P11.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) N18 CtxB
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
============================
 mem X N
 < SN_P: case SN_P14.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P16 : stmtNames Ctx11 (seq (assign Hold (name Copy)) (assign L (tail (name L)))) N20 CtxB
SN_P17 : N19 ++ N20 = N18
============================
 mem X N
 < SN_P: case SN_P16.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N10 Ctx2
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
============================
 mem X N
 < SN_P: case SN_P5.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 Ctx13 N24
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) N23 Ctx13
SN_P20 : stmtNames Ctx13 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2
SN_P21 : N23 ++ N24 = N10
============================
 mem X N
 < SN_P: case SN_P5.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN CtxT FN CtxF N25
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2
SN_P21 : N23 ++ N24 = N10
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (null (name L)) CN1
SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT
SN_P23 : stmtNames ([]::((Hold::Scope1)::Ctx6)) noop FN CtxF
SN_P24 : CN1 ++ TN = N25
SN_P25 : N25 ++ FN = N23
============================
 mem X N
 < SN_P: case SN_P5.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN CtxT FN CtxF N25
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2
SN_P21 : N23 ++ N24 = N10
SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT
SN_P23 : stmtNames ([]::((Hold::Scope1)::Ctx6)) noop FN CtxF
SN_P24 : CN1 ++ TN = N25
SN_P25 : N25 ++ FN = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
============================
 mem X N
 < case SN_P23.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN CtxT N25
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2
SN_P21 : N23 ++ N24 = N10
SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT
SN_P24 : CN1 ++ TN = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
============================
 mem X N
 < SN_P: case SN_P22.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN N25
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ TN = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P22 : exprNames ([]::((Hold::Scope1)::Ctx6)) (errorExpr (stringLit "Invalid update") intTy) TN
============================
 mem X N
 < SN_P: case SN_P22.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 TN N25
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ TN = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P22 : exprNames ([]::((Hold::Scope1)::Ctx6)) (stringLit "Invalid update") TN
============================
 mem X N
 < case SN_P22.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N24 Ctx2
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
============================
 mem X N
 < SN_P: case SN_P20.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 Ctx14 N27
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx14
SN_P22 : stmtNames Ctx14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) N27 Ctx2
SN_P23 : N26 ++ N27 = N24
============================
 mem X N
 < SN_P: case SN_P22.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P22 : exprNames Ctx2 (not (null (name Hold))) CN2
SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1
SN_P27 : CN2 ++ BN1 = N27
============================
 mem X N
 < SN_P: case SN_P22.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (null (name Hold)) CN2
============================
 mem X N
 < SN_P: case SN_P22.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
============================
 mem X N
 < SN_P: case SN_P26.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 Ctx15 N29
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P26 : stmtNames ([]::Ctx2) (declare intTy Copy (name Hold)) N28 Ctx15
SN_P28 : stmtNames Ctx15 (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) N29 CtxB1
SN_P29 : N28 ++ N29 = BN1
============================
 mem X N
 < SN_P: case SN_P26.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P28 : stmtNames ([Copy]::Ctx2) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) N29 CtxB1
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
============================
 mem X N
 < SN_P: case SN_P28.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P30 : stmtNames Ctx16 (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))) N31 CtxB1
SN_P31 : N30 ++ N31 = N29
============================
 mem X N
 < SN_P: case SN_P30.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N5 = [] /\
   Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx).

Subgoal 1.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N5 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx)
 < A: case SN_P.

Subgoal 1.1.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N5
============================
 N5 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < E: case A1.

Subgoal 1.1.1.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : [] ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
E : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
============================
 [] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < search.

Subgoal 1.1.1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : [SaveI] ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
E : not_mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
============================
 [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case E.

Subgoal 1.1.1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : [SaveI] ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
N : not_mem SaveI [SaveE, SaveI]
N1 : not_mems SaveI (Scope::Ctx)
============================
 [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case N.

Subgoal 1.1.1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : [SaveI] ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
N1 : not_mems SaveI (Scope::Ctx)
N : SaveE = SaveI -> false
N2 : not_mem SaveI [SaveI]
============================
 [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case N2.

Subgoal 1.1.1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : [SaveI] ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
N1 : not_mems SaveI (Scope::Ctx)
N : SaveE = SaveI -> false
N2 : SaveI = SaveI -> false
N3 : not_mem SaveI []
============================
 [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < apply N2 to _.

Subgoal 1.1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : SaveI::N34 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : not_mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N34
============================
 SaveI::N34 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case A.

Subgoal 1.1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : SaveI::N34 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N34
N : not_mem SaveI [SaveE, SaveI]
N1 : not_mems SaveI (Scope::Ctx)
============================
 SaveI::N34 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case N.

Subgoal 1.1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : SaveI::N34 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N34
N1 : not_mems SaveI (Scope::Ctx)
N : SaveE = SaveI -> false
N2 : not_mem SaveI [SaveI]
============================
 SaveI::N34 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case N2.

Subgoal 1.1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P4 : SaveI::N34 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N34
N1 : not_mems SaveI (Scope::Ctx)
N : SaveE = SaveI -> false
N2 : SaveI = SaveI -> false
N3 : not_mem SaveI []
============================
 SaveI::N34 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < apply N2 to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N5 N6 Ctx6 Scope1 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N5 (Scope1::Ctx6)
SN_P4 : N5 ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N12
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N5 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx)
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N6 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) [] ([SaveE, SaveI]::(Scope::Ctx))
SN_P4 : [] ++ N6 = N4
SN_P6 : N9 ++ N10 = N6
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P4.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) [] ([SaveE, SaveI]::(Scope::Ctx))
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N13 = [].

Subgoal 1.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N13 = []
 < E: case SN_P1.

Subgoal 1.1.2.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P12 : [] ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = []
 < search.

Subgoal 1.1.2.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P12 : [SaveI] ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [SaveI] = []
 < N: case E.

Subgoal 1.1.2.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P12 : [SaveI] ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem SaveI [Hold, SaveE, SaveI]
N1 : not_mems SaveI (Scope::Ctx)
============================
 [SaveI] = []
 < N: case N.

Subgoal 1.1.2.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P12 : [SaveI] ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N1 : not_mems SaveI (Scope::Ctx)
N : Hold = SaveI -> false
N2 : not_mem SaveI [SaveE, SaveI]
============================
 [SaveI] = []
 < N: case N2.

Subgoal 1.1.2.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P12 : [SaveI] ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N1 : not_mems SaveI (Scope::Ctx)
N : Hold = SaveI -> false
N2 : SaveE = SaveI -> false
N3 : not_mem SaveI [SaveI]
============================
 [SaveI] = []
 < N: case N3.

Subgoal 1.1.2.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P12 : [SaveI] ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N1 : not_mems SaveI (Scope::Ctx)
N : Hold = SaveI -> false
N2 : SaveE = SaveI -> false
N3 : SaveI = SaveI -> false
N4 : not_mem SaveI []
============================
 [SaveI] = []
 < apply N3 to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N13 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N13
SN_P12 : N13 ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N13 = []
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N11 N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : N11 ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) []
SN_P12 : [] ++ [] = N11
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P12.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N12 N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P10 : [] ++ N12 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) []
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N12
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P10.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) []
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P1.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert CN = [].

Subgoal 1.1.3:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 CN = []
 < E: case SN_P9.

Subgoal 1.1.3.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : [] ++ BN = N9
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = []
 < search.

Subgoal 1.1.3.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : [L] ++ BN = N9
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = []
 < N: case E.

Subgoal 1.1.3.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : [L] ++ BN = N9
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem L [Hold, SaveE, SaveI]
N1 : not_mems L (Scope::Ctx)
============================
 [L] = []
 < apply not_mems to N1 SN.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CN BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : CN ++ BN = N9
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : CN = []
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 BN CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P8 : [] ++ BN = N9
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) []
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = BN
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P8.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) []
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P9.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N15 = [] /\
   Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.1.4:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N15 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < A: case SN_P7.

Subgoal 1.1.4.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N15
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case A1.

Subgoal 1.1.4.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name SaveI) N34
E1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (num 1) N35
E2 : N34 ++ N35 = N15
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case E1.

Subgoal 1.1.4.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name SaveI) N34
E2 : N34 ++ [] = N15
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case E.

Subgoal 1.1.4.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [] ++ [] = N15
E : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case E2.

Subgoal 1.1.4.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : [] ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.1.4.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N15
E : not_mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.1.4.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N15
N : not_mem SaveI []
N1 : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.4.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N15
N : not_mem SaveI []
N1 : not_mem SaveI [Hold, SaveE, SaveI]
N2 : not_mems SaveI (Scope::Ctx)
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.4.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N15
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : not_mem SaveI [SaveE, SaveI]
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N3.

Subgoal 1.1.4.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N15
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : SaveE = SaveI -> false
N4 : not_mem SaveI [SaveI]
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N4.

Subgoal 1.1.4.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N15
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : SaveE = SaveI -> false
N4 : SaveI = SaveI -> false
N5 : not_mem SaveI []
============================
 N15 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N4 to _.

Subgoal 1.1.4.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : SaveI::N34 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : not_mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34
============================
 SaveI::N34 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case A.

Subgoal 1.1.4.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : SaveI::N34 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34
N : not_mem SaveI []
N1 : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 SaveI::N34 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.4.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : SaveI::N34 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34
N : not_mem SaveI []
N1 : not_mem SaveI [Hold, SaveE, SaveI]
N2 : not_mems SaveI (Scope::Ctx)
============================
 SaveI::N34 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.4.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : SaveI::N34 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : not_mem SaveI [SaveE, SaveI]
============================
 SaveI::N34 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N3.

Subgoal 1.1.4.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : SaveI::N34 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : SaveE = SaveI -> false
N4 : not_mem SaveI [SaveI]
============================
 SaveI::N34 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N4.

Subgoal 1.1.4.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P13 : SaveI::N34 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N34
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : SaveE = SaveI -> false
N4 : SaveI = SaveI -> false
N5 : not_mem SaveI []
============================
 SaveI::N34 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N4 to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N15 N16 N17 N18 Ctx10 Scope2 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N15 (Scope2::Ctx10)
SN_P13 : N15 ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames (Scope2::Ctx10) (name L) N17
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N15 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N16 N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) [] ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P13 : [] ++ N16 = N9
SN_P15 : N17 ++ N18 = N16
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P13.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) [] ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P15 : N17 ++ N18 = N9
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P7.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P15 : N17 ++ N18 = N9
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N17 = [].

Subgoal 1.1.5:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P15 : N17 ++ N18 = N9
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N17 = []
 < E: case SN_P11.

Subgoal 1.1.5.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P15 : [] ++ N18 = N9
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : mems L ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = []
 < search.

Subgoal 1.1.5.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P15 : [L] ++ N18 = N9
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : not_mems L ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L] = []
 < N: case E.

Subgoal 1.1.5.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P15 : [L] ++ N18 = N9
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem L []
N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = []
 < N: case N1.

Subgoal 1.1.5.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P15 : [L] ++ N18 = N9
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem L []
N1 : not_mem L [Hold, SaveE, SaveI]
N2 : not_mems L (Scope::Ctx)
============================
 [L] = []
 < apply not_mems to N2 _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N17 N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P15 : N17 ++ N18 = N9
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N17
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N17 = []
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N18 N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P15 : [] ++ N18 = N9
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) []
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N18
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P15.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) []
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N9
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P11.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N9
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N19 = [] /\
   Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.1.6:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N9
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N19 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < R: case SN_P14.

Subgoal 1.1.6.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : N19 ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N19
============================
 N19 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case R1.

Subgoal 1.1.6.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : [] ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.1.6.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : [Hold] ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Hold] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.1.6.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : [Hold] ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Hold] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.6.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : [Hold] ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 [Hold] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.6.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : [Hold] ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 [Hold] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N1 to _.

Subgoal 1.1.6.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : Copy::N34 ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N34
============================
 Copy::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case R.

Subgoal 1.1.6.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : Copy::N34 ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N34
N : not_mem Copy [Copy]
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 Copy::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N.

Subgoal 1.1.6.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P17 : Copy::N34 ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N34
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : Copy = Copy -> false
N2 : not_mem Copy []
============================
 Copy::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N19 Ctx11 N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N19 Ctx11
SN_P17 : N19 ++ N20 = N9
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N19 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N20 N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P17 : [] ++ N20 = N9
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N20
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P17.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P14.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N21 = [] /\
   Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.1.7:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N21 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < A: case SN_P16.

Subgoal 1.1.7.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N21
============================
 N21 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case A1.

Subgoal 1.1.7.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : [] ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.1.7.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : [Copy] ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.1.7.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : [Copy] ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Copy [Copy]
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N.

Subgoal 1.1.7.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : [Copy] ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : Copy = Copy -> false
N2 : not_mem Copy []
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N to _.

Subgoal 1.1.7.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : Hold::N34 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34
============================
 Hold::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case A.

Subgoal 1.1.7.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : Hold::N34 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34
N : not_mem Hold [Copy]
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 Hold::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.7.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : Hold::N34 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34
N : not_mem Hold [Copy]
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 Hold::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.7.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : Hold::N34 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34
N : not_mem Hold [Copy]
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 Hold::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N1 to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N21 Ctx12 N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N21 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N22 CtxB
SN_P19 : N21 ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N21 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N22 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N22 CtxB
SN_P19 : [] ++ N22 = N9
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P19.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N9 CtxB
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P16.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N9 CtxB
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N9 = [] /\
   CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.1.8:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N9 CtxB
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N9 = [] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < A: case SN_P18.

Subgoal 1.1.8.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N9
============================
 N9 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case A1.

Subgoal 1.1.8.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N9
============================
 N9 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case E.

Subgoal 1.1.8.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : [] ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.1.8.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : [L] ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.1.8.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : [L] ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem L [Copy]
N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.8.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : [L] ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem L [Copy]
N1 : not_mem L [Hold, SaveE, SaveI]
N2 : not_mems L (Scope::Ctx)
============================
 [L] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply not_mems to N2 _.

Subgoal 1.1.8.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : L::N34 ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N34
============================
 L::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case A.

Subgoal 1.1.8.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : L::N34 ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N34
N : not_mem L [Copy]
N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 L::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.8.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : L::N34 ++ N10 = N4
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N34
N : not_mem L [Copy]
N1 : not_mem L [Hold, SaveE, SaveI]
N2 : not_mems L (Scope::Ctx)
============================
 L::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply not_mems to N2 _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N9 N10 CtxB N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : N9 ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N9 CtxB
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N9 = [] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N10 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P6 : [] ++ N10 = N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P21 : N23 ++ N24 = N10
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P6.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P21 : N23 ++ N24 = N4
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P18.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : N23 ++ N24 = N4
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert CN1 = [].

Subgoal 1.1.9:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : N23 ++ N24 = N4
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 CN1 = []
 < E: case SN_P5.

Subgoal 1.1.9.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : N23 ++ N24 = N4
SN_P24 : [] ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = []
 < search.

Subgoal 1.1.9.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : N23 ++ N24 = N4
SN_P24 : [L] ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = []
 < N: case E.

Subgoal 1.1.9.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : N23 ++ N24 = N4
SN_P24 : [L] ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem L [Hold, SaveE, SaveI]
N1 : not_mems L (Scope::Ctx)
============================
 [L] = []
 < apply not_mems to N1 _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 CN1 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : N23 ++ N24 = N4
SN_P24 : CN1 ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : CN1 = []
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N25 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : N23 ++ N24 = N4
SN_P24 : [] ++ [] = N25
SN_P25 : N25 ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) []
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P24.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N23 N24 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : N23 ++ N24 = N4
SN_P25 : [] ++ [] = N23
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) []
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P25.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N24 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P21 : [] ++ N24 = N4
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) []
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N24
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P21.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) []
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P5.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N26 = [] /\
   Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx).

Subgoal 1.1.10:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N26 = [] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < R: case SN_P20.

Subgoal 1.1.10.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P23 : N26 ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N26
============================
 N26 = [] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < E: case R1.

Subgoal 1.1.10.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P23 : [] ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
E : mems SaveE ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = [] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < search.

Subgoal 1.1.10.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P23 : [SaveE] ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
E : not_mems SaveE ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [SaveE] = [] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < N: case E.

Subgoal 1.1.10.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P23 : [SaveE] ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : not_mem SaveE [Hold, SaveE, SaveI]
N1 : not_mems SaveE (Scope::Ctx)
============================
 [SaveE] = [] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < N: case N.

Subgoal 1.1.10.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P23 : [SaveE] ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
N1 : not_mems SaveE (Scope::Ctx)
N : Hold = SaveE -> false
N2 : not_mem SaveE [SaveE, SaveI]
============================
 [SaveE] = [] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < N: case N2.

Subgoal 1.1.10.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P23 : [SaveE] ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
N1 : not_mems SaveE (Scope::Ctx)
N : Hold = SaveE -> false
N2 : SaveE = SaveE -> false
N3 : not_mem SaveE [SaveI]
============================
 [SaveE] = [] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < apply N2 to _.

Subgoal 1.1.10.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P23 : L::N34 ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N34
============================
 L::N34 = [] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < N: case R.

Subgoal 1.1.10.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P23 : L::N34 ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N34
N : not_mem L [Hold, SaveE, SaveI]
N1 : not_mems L (Scope::Ctx)
============================
 L::N34 = [] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < apply not_mems to N1 _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2 N2 N3 N1 N4 N26 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N26 Ctx2
SN_P23 : N26 ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N28
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N26 = [] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx)
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 N27 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [] ([Hold, SaveE, SaveI]::(Scope::Ctx))
SN_P23 : [] ++ N27 = N4
SN_P27 : CN2 ++ BN1 = N27
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P23.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [] ([Hold, SaveE, SaveI]::(Scope::Ctx))
SN_P27 : CN2 ++ BN1 = N4
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P20.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P27 : CN2 ++ BN1 = N4
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert CN2 = [].

Subgoal 1.1.11:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P27 : CN2 ++ BN1 = N4
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 CN2 = []
 < E: case SN_P22.

Subgoal 1.1.11.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P27 : [] ++ BN1 = N4
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = []
 < search.

Subgoal 1.1.11.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P27 : [Hold] ++ BN1 = N4
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Hold] = []
 < N: case E.

Subgoal 1.1.11.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P27 : [Hold] ++ BN1 = N4
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem Hold [Hold, SaveE, SaveI]
N1 : not_mems Hold (Scope::Ctx)
============================
 [Hold] = []
 < N: case N.

Subgoal 1.1.11.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P27 : [Hold] ++ BN1 = N4
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N1 : not_mems Hold (Scope::Ctx)
N : Hold = Hold -> false
N2 : not_mem Hold [SaveE, SaveI]
============================
 [Hold] = []
 < apply N to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CN2 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P27 : CN2 ++ BN1 = N4
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : CN2 = []
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 BN1 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P27 : [] ++ BN1 = N4
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) []
SN_P29 : N28 ++ N29 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P27.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) []
SN_P29 : N28 ++ N29 = N4
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P22.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : N28 ++ N29 = N4
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N28 = [].

Subgoal 1.1.12:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : N28 ++ N29 = N4
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N28 = []
 < E: case SN_P26.

Subgoal 1.1.12.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : [] ++ N29 = N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : mems Hold ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = []
 < search.

Subgoal 1.1.12.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : [Hold] ++ N29 = N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
E : not_mems Hold ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Hold] = []
 < N: case E.

Subgoal 1.1.12.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : [Hold] ++ N29 = N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem Hold []
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Hold] = []
 < N: case N1.

Subgoal 1.1.12.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : [Hold] ++ N29 = N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem Hold []
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 [Hold] = []
 < N: case N1.

Subgoal 1.1.12.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : [Hold] ++ N29 = N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
N : not_mem Hold []
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 [Hold] = []
 < apply N1 to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N28 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : N28 ++ N29 = N4
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N28
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N28 = []
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N29 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P29 : [] ++ N29 = N4
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) []
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N29
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P29.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) []
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N4
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < clear SN_P26.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N4
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < Eq: assert N30 = [] /\
   Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.1.13:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N4
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 N30 = [] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < R: case SN_P28.

Subgoal 1.1.13.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P31 : N30 ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N30
============================
 N30 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case R1.

Subgoal 1.1.13.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P31 : [] ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.1.13.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P31 : [L] ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.1.13.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P31 : [L] ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem L [Copy]
N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.13.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P31 : [L] ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem L [Copy]
N1 : not_mem L [Hold, SaveE, SaveI]
N2 : not_mems L (Scope::Ctx)
============================
 [L] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply not_mems to N2 _.

Subgoal 1.1.13.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P31 : Copy::N34 ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N34
============================
 Copy::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case R.

Subgoal 1.1.13.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P31 : Copy::N34 ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N34
N : not_mem Copy [Copy]
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 Copy::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N.

Subgoal 1.1.13.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P31 : Copy::N34 ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N34
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : Copy = Copy -> false
N2 : not_mem Copy []
============================
 Copy::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N30 Ctx16 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N30 Ctx16
SN_P31 : N30 ++ N31 = N4
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
Eq : N30 = [] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N31 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P31 : [] ++ N31 = N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N31
============================
 mem X N
 < case SN_P31.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N4
============================
 mem X N
 < clear SN_P28.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N4
============================
 mem X N
 < Eq: assert N32 = [] /\
   Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.1.14:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N4
============================
 N32 = [] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < A: case SN_P30.

Subgoal 1.1.14.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N4
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N32
============================
 N32 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case A1.

Subgoal 1.1.14.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : [] ++ N33 = N4
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.1.14.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : [Copy] ++ N33 = N4
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.1.14.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : [Copy] ++ N33 = N4
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Copy [Copy]
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N.

Subgoal 1.1.14.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : [Copy] ++ N33 = N4
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : Copy = Copy -> false
N2 : not_mem Copy []
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N to _.

Subgoal 1.1.14.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : L::N34 ++ N33 = N4
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34
============================
 L::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case A.

Subgoal 1.1.14.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : L::N34 ++ N33 = N4
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34
N : not_mem L [Copy]
N1 : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 L::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.1.14.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : L::N34 ++ N33 = N4
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N34
N : not_mem L [Copy]
N1 : not_mem L [Hold, SaveE, SaveI]
N2 : not_mems L (Scope::Ctx)
============================
 L::N34 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply not_mems to N2 _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N32 Ctx17 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N32 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : N32 ++ N33 = N4
Eq : N32 = [] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1 N33
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N33 CtxB1
SN_P33 : [] ++ N33 = N4
============================
 mem X N
 < case SN_P33.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N4 CtxB1
============================
 mem X N
 < clear SN_P30.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N4 CtxB1
============================
 mem X N
 < Eq: assert N4 = [].

Subgoal 1.1.15:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N4 CtxB1
============================
 N4 = []
 < A: case SN_P32.

Subgoal 1.1.15.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N4
============================
 N4 = []
 < E: case A1.

Subgoal 1.1.15.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N4
============================
 N4 = []
 < E: case E.

Subgoal 1.1.15.1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ [] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = []
 < search.

Subgoal 1.1.15.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ [Hold] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Hold] = []
 < N: case E.

Subgoal 1.1.15.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ [Hold] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Hold] = []
 < N: case N1.

Subgoal 1.1.15.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ [Hold] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 [Hold] = []
 < N: case N1.

Subgoal 1.1.15.1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ [Hold] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 [Hold] = []
 < apply N1 to _.

Subgoal 1.1.15.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ Hold::N34 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N34
============================
 Hold::N34 = []
 < N: case A.

Subgoal 1.1.15.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ Hold::N34 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N34
N : not_mem Hold [Copy]
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 Hold::N34 = []
 < N: case N1.

Subgoal 1.1.15.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ Hold::N34 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N34
N : not_mem Hold [Copy]
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 Hold::N34 = []
 < N: case N1.

Subgoal 1.1.15.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ Hold::N34 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N34
N : not_mem Hold [Copy]
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 Hold::N34 = []
 < apply N1 to _.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ N4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N4 CtxB1
Eq : N4 = []
============================
 mem X N
 < case Eq.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 N1 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N1 ++ [] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N1
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) [] CtxB1
============================
 mem X N
 < apply append_nil_right to SN_P3.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N3 ++ [] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) [] CtxB1
============================
 mem X N
 < clear SN_P3
   SN_P32.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
============================
 mem X N
 < Or: apply mem_append to M SN_P2.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
Or : mem X N2 \/ mem X N3
============================
 mem X N
 < M': case Or.

Subgoal 1.1.16:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
M' : mem X N2
============================
 mem X N
 < MI: apply exprNames_increaseCtxs to _ _ _ _ SN1 SN_PI M'.

Subgoal 1.1.16:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
M' : mem X N2
MI : mem X NI
============================
 mem X N
 < apply mem_append_left to MI SN3.

Subgoal 1.1.16:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
M' : mem X N2
MI : mem X NI
H4 : mem X N
============================
 mem X N
 < search.

Subgoal 1.1.17:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
M' : mem X N3
============================
 mem X N
 < apply fresh_name_is to _ Pr1.

Subgoal 1.1.17:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
M' : mem X N3
H4 : is_string SaveI
============================
 mem X N
 < ME: apply exprNames_increaseCtxs to _ _ _ _ SN2 SN_PE M'.

Subgoal 1.1.17:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
M' : mem X N3
H4 : is_string SaveI
ME : mem X NE
============================
 mem X N
 < apply mem_append_right to ME SN3.

Subgoal 1.1.17:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE N2 N3 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N3
M' : mem X N3
H4 : is_string SaveI
ME : mem X NE
H5 : mem X N
============================
 mem X N
 < search.

Subgoal 1.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
============================
 mem X (L::N1)
 < apply fresh_name_is to _ Pr1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
============================
 mem X (L::N1)
 < apply fresh_name_is to _ Pr2.

Subgoal 1.2.1:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
============================
 mem X (L::N1)
 < NotI: assert L = SaveI -> false.

Subgoal 1.2.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
============================
 L = SaveI -> false
 < intros E.

Subgoal 1.2.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
E : L = SaveI
============================
 false
 < case E.

Subgoal 1.2.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
============================
 mem X (L::N1)
 < NotHold: assert L = Hold -> false.

Subgoal 1.2.3:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
============================
 L = Hold -> false
 < intros E.

Subgoal 1.2.3:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
E : L = Hold
============================
 false
 < case E.

Subgoal 1.2.3:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
============================
 false
 < apply fresh_name_not_mem to Pr2 _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
============================
 mem X (L::N1)
 < NotE: assert L = SaveE -> false.

Subgoal 1.2.4:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
============================
 L = SaveE -> false
 < intros E.

Subgoal 1.2.4:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
E : L = SaveE
============================
 false
 < case E.

Subgoal 1.2.4:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
============================
 false
 < apply fresh_name_not_mem to Pr3 _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
============================
 mem X (L::N1)
 < NotCopy: assert L = Copy -> false.

Subgoal 1.2.5:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
============================
 L = Copy -> false
 < intros E.

Subgoal 1.2.5:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
E : L = Copy
============================
 false
 < case E.

Subgoal 1.2.5:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (Copy::Names) SaveI
Pr2 : fresh_name "Hold" (Copy::Names) Hold
Pr3 : fresh_name "E" (Copy::Names) SaveE
Pr4 : fresh_name "C" (Copy::Names) Copy
H1 : is_string Copy
H2 : is_expr I
H3 : is_expr E
SN : not_mems Copy (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Copy = SaveI -> false
NotHold : Copy = Hold -> false
NotE : Copy = SaveE -> false
============================
 false
 < apply fresh_name_not_mem to Pr4 _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
============================
 mem X (L::N1)
 < SN_P: case SN_P.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2
============================
 mem X (L::N1)
 < SN_P: case SN_P.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 Ctx1 N3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P : stmtNames ([]::(Scope::Ctx)) (declare intTy SaveI I) N2 Ctx1
SN_P1 : stmtNames Ctx1 (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) N3 Ctx2
SN_P2 : N2 ++ N3 = N_P
============================
 mem X (L::N1)
 < SN_PI: case SN_P.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P1 : stmtNames ([SaveI]::(Scope::Ctx)) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) N3 Ctx2
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
============================
 mem X (L::N1)
 < SN_P: case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 Ctx3 N5
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P : stmtNames ([SaveI]::(Scope::Ctx)) (declare intTy SaveE E) N4 Ctx3
SN_P1 : stmtNames Ctx3 (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) N5 Ctx2
SN_P3 : N4 ++ N5 = N3
============================
 mem X (L::N1)
 < SN_PE: case SN_P.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P1 : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) N5 Ctx2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
============================
 mem X (L::N1)
 < SN_P: case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 Ctx4 N7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 Ctx4
SN_P1 : stmtNames Ctx4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) N7 Ctx2
SN_P4 : N6 ++ N7 = N5
============================
 mem X (L::N1)
 < SN_P: case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 Ctx4 N7 N8 Ctx5 N9
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 Ctx4
SN_P4 : N6 ++ N7 = N5
SN_P1 : stmtNames Ctx4 (declare intTy Hold (nil intTy)) N8 Ctx5
SN_P5 : stmtNames Ctx5 (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N9 Ctx2
SN_P6 : N8 ++ N9 = N7
============================
 mem X (L::N1)
 < SN_P: case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 N8 N9 Ctx6 Scope1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N9 Ctx2
SN_P6 : N8 ++ N9 = N7
SN_P1 : exprNames (Scope1::Ctx6) (nil intTy) N8
============================
 mem X (L::N1)
 < case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 N9 Ctx6 Scope1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N9 Ctx2
SN_P6 : [] ++ N9 = N7
============================
 mem X (L::N1)
 < case SN_P6.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) N7 Ctx2
============================
 mem X (L::N1)
 < SN_P: case SN_P5.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 Ctx7 N11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P1 : stmtNames ((Hold::Scope1)::Ctx6) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) N10 Ctx7
SN_P5 : stmtNames Ctx7 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
============================
 mem X (L::N1)
 < SN_P: case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) CN
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N10
============================
 mem X (L::N1)
 < SN_P: case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N10
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (not (eq (name SaveI) (num 0))) N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N13
SN_P10 : N12 ++ N13 = CN
============================
 mem X (L::N1)
 < SN_P: case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N10
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N13
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (eq (name SaveI) (num 0)) N12
============================
 mem X (L::N1)
 < SN_P: case SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N15
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N10
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N13
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P11 : exprNames ((Hold::Scope1)::Ctx6) (num 0) N15
SN_P12 : N14 ++ N15 = N12
============================
 mem X (L::N1)
 < case SN_P11.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N10
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (not (null (name L))) N13
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
============================
 mem X (L::N1)
 < SN_P: case SN_P9.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (null (name L)) N13
============================
 mem X (L::N1)
 < SN_P: case SN_P9.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) BN CtxB
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
============================
 mem X (L::N1)
 < SN_P: case SN_P7.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 Ctx8 N17
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 Ctx8
SN_P11 : stmtNames Ctx8 (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))) N17 CtxB
SN_P13 : N16 ++ N17 = BN
============================
 mem X (L::N1)
 < SN_P: case SN_P11.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 Ctx8 N17 N18 Ctx9 N19
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 Ctx8
SN_P13 : N16 ++ N17 = BN
SN_P11 : stmtNames Ctx8 (declare intTy Copy (name L)) N18 Ctx9
SN_P14 : stmtNames Ctx9 (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) N19 CtxB
SN_P15 : N18 ++ N19 = N17
============================
 mem X (L::N1)
 < SN_P: case SN_P11.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) N19 CtxB
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
============================
 mem X (L::N1)
 < SN_P: case SN_P14.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P16 : stmtNames Ctx11 (seq (assign Hold (name Copy)) (assign L (tail (name L)))) N21 CtxB
SN_P17 : N20 ++ N21 = N19
============================
 mem X (L::N1)
 < SN_P: case SN_P16.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) N11 Ctx2
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
============================
 mem X (L::N1)
 < SN_P: case SN_P5.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 Ctx13 N25
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P5 : stmtNames ((Hold::Scope1)::Ctx6) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) N24 Ctx13
SN_P20 : stmtNames Ctx13 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2
SN_P21 : N24 ++ N25 = N11
============================
 mem X (L::N1)
 < SN_P: case SN_P5.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN CtxT FN CtxF N26
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2
SN_P21 : N24 ++ N25 = N11
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (null (name L)) CN1
SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT
SN_P23 : stmtNames ([]::((Hold::Scope1)::Ctx6)) noop FN CtxF
SN_P24 : CN1 ++ TN = N26
SN_P25 : N26 ++ FN = N24
============================
 mem X (L::N1)
 < SN_P: case SN_P5.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN CtxT FN CtxF N26
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2
SN_P21 : N24 ++ N25 = N11
SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT
SN_P23 : stmtNames ([]::((Hold::Scope1)::Ctx6)) noop FN CtxF
SN_P24 : CN1 ++ TN = N26
SN_P25 : N26 ++ FN = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
============================
 mem X (L::N1)
 < case SN_P23.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN CtxT N26
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2
SN_P21 : N24 ++ N25 = N11
SN_P22 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) TN CtxT
SN_P24 : CN1 ++ TN = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
============================
 mem X (L::N1)
 < SN_P: case SN_P22.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN N26
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ TN = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P22 : exprNames ([]::((Hold::Scope1)::Ctx6)) (errorExpr (stringLit "Invalid update") intTy) TN
============================
 mem X (L::N1)
 < SN_P: case SN_P22.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 TN N26
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ TN = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P22 : exprNames ([]::((Hold::Scope1)::Ctx6)) (stringLit "Invalid update") TN
============================
 mem X (L::N1)
 < case SN_P22.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) N25 Ctx2
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
============================
 mem X (L::N1)
 < SN_P: case SN_P20.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 Ctx14 N28
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx14
SN_P22 : stmtNames Ctx14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) N28 Ctx2
SN_P23 : N27 ++ N28 = N25
============================
 mem X (L::N1)
 < SN_P: case SN_P22.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P22 : exprNames Ctx2 (not (null (name Hold))) CN2
SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1
SN_P27 : CN2 ++ BN1 = N28
============================
 mem X (L::N1)
 < SN_P: case SN_P22.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (null (name Hold)) CN2
============================
 mem X (L::N1)
 < SN_P: case SN_P22.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P26 : stmtNames ([]::Ctx2) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) BN1 CtxB1
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
============================
 mem X (L::N1)
 < SN_P: case SN_P26.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 Ctx15 N30
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P26 : stmtNames ([]::Ctx2) (declare intTy Copy (name Hold)) N29 Ctx15
SN_P28 : stmtNames Ctx15 (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) N30 CtxB1
SN_P29 : N29 ++ N30 = BN1
============================
 mem X (L::N1)
 < SN_P: case SN_P26.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P28 : stmtNames ([Copy]::Ctx2) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) N30 CtxB1
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
============================
 mem X (L::N1)
 < SN_P: case SN_P28.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P30 : stmtNames Ctx16 (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))) N32 CtxB1
SN_P31 : N31 ++ N32 = N30
============================
 mem X (L::N1)
 < SN_P: case SN_P30.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N6 = [] /\
   Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx).

Subgoal 1.2.6:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N6 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx)
 < A: case SN_P.

Subgoal 1.2.6.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N6
============================
 N6 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < E: case A1.

Subgoal 1.2.6.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : [] ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
E : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
============================
 [] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < search.

Subgoal 1.2.6.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : [SaveI] ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
E : not_mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
============================
 [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case E.

Subgoal 1.2.6.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : [SaveI] ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
N : not_mem SaveI [SaveE, SaveI]
N1 : not_mems SaveI (Scope::Ctx)
============================
 [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case N.

Subgoal 1.2.6.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : [SaveI] ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
N1 : not_mems SaveI (Scope::Ctx)
N : SaveE = SaveI -> false
N2 : not_mem SaveI [SaveI]
============================
 [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case N2.

Subgoal 1.2.6.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : [SaveI] ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
N1 : not_mems SaveI (Scope::Ctx)
N : SaveE = SaveI -> false
N2 : SaveI = SaveI -> false
N3 : not_mem SaveI []
============================
 [SaveI] = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < apply N2 to _.

Subgoal 1.2.6.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : SaveI::N35 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems SaveI ([SaveE, SaveI]::(Scope::Ctx))
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N35
============================
 SaveI::N35 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case A.

Subgoal 1.2.6.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : SaveI::N35 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N35
N : not_mem SaveI [SaveE, SaveI]
N1 : not_mems SaveI (Scope::Ctx)
============================
 SaveI::N35 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case N.

Subgoal 1.2.6.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : SaveI::N35 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N35
N1 : not_mems SaveI (Scope::Ctx)
N : SaveE = SaveI -> false
N2 : not_mem SaveI [SaveI]
============================
 SaveI::N35 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < N: case N2.

Subgoal 1.2.6.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P4 : SaveI::N35 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N35
N1 : not_mems SaveI (Scope::Ctx)
N : SaveE = SaveI -> false
N2 : SaveI = SaveI -> false
N3 : not_mem SaveI []
============================
 SaveI::N35 = [] /\ [SaveE, SaveI]::(Scope::Ctx) = [SaveE, SaveI]::(Scope::Ctx)
 < apply N2 to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N6 N7 Ctx6 Scope1 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) N6 (Scope1::Ctx6)
SN_P4 : N6 ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ((Hold::Scope1)::Ctx6) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ((Hold::Scope1)::Ctx6) (name L) N13
SN_P7 : stmtNames ([]::((Hold::Scope1)::Ctx6)) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ((Hold::Scope1)::Ctx6) (name L) CN1
SN_P20 : stmtNames ((Hold::Scope1)::Ctx6) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N6 = [] /\ Scope1::Ctx6 = [SaveE, SaveI]::(Scope::Ctx)
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N7 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) [] ([SaveE, SaveI]::(Scope::Ctx))
SN_P4 : [] ++ N7 = N5
SN_P6 : N10 ++ N11 = N7
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < case SN_P4.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P : stmtNames ([SaveE, SaveI]::(Scope::Ctx)) (assign SaveI (name SaveI)) [] ([SaveE, SaveI]::(Scope::Ctx))
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N14 = [].

Subgoal 1.2.7:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N14 = []
 < E: case SN_P1.

Subgoal 1.2.7.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P12 : [] ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = []
 < search.

Subgoal 1.2.7.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P12 : [SaveI] ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [SaveI] = []
 < N: case E.

Subgoal 1.2.7.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P12 : [SaveI] ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N : not_mem SaveI [Hold, SaveE, SaveI]
N1 : not_mems SaveI (Scope::Ctx)
============================
 [SaveI] = []
 < N: case N.

Subgoal 1.2.7.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P12 : [SaveI] ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N1 : not_mems SaveI (Scope::Ctx)
N : Hold = SaveI -> false
N2 : not_mem SaveI [SaveE, SaveI]
============================
 [SaveI] = []
 < N: case N2.

Subgoal 1.2.7.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P12 : [SaveI] ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N1 : not_mems SaveI (Scope::Ctx)
N : Hold = SaveI -> false
N2 : SaveE = SaveI -> false
N3 : not_mem SaveI [SaveI]
============================
 [SaveI] = []
 < N: case N3.

Subgoal 1.2.7.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P12 : [SaveI] ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N1 : not_mems SaveI (Scope::Ctx)
N : Hold = SaveI -> false
N2 : SaveE = SaveI -> false
N3 : SaveI = SaveI -> false
N4 : not_mem SaveI []
============================
 [SaveI] = []
 < apply N3 to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N14 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) N14
SN_P12 : N14 ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N14 = []
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N12 N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : N12 ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) []
SN_P12 : [] ++ [] = N12
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < case SN_P12.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N13 N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P10 : [] ++ N13 = CN
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) []
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) N13
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < case SN_P10.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) []
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P1.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert CN = [L].

Subgoal 1.2.8:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 CN = [L]
 < E: case SN_P9.

Subgoal 1.2.8.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = [L]
 < M': case E.

Subgoal 1.2.8.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [Hold, SaveE, SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.8.1.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
NotHold : Hold = Hold -> false
NotE : Hold = SaveE -> false
NotCopy : Hold = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name Hold) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign Hold (tail (name Hold))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [Hold]
 < apply NotHold to _.

Subgoal 1.2.8.1.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [SaveE, SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.8.1.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
NotE : SaveE = SaveE -> false
NotCopy : SaveE = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name SaveE) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign SaveE (tail (name SaveE))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [SaveE]
 < apply NotE to _.

Subgoal 1.2.8.1.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.8.1.1.2.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveI = SaveI -> false
NotHold : SaveI = Hold -> false
NotE : SaveI = SaveE -> false
NotCopy : SaveI = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name SaveI) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign SaveI (tail (name SaveI))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [SaveI]
 < apply NotI to _.

Subgoal 1.2.8.1.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L []
============================
 [] = [L]
 < case M'.

Subgoal 1.2.8.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mems L (Scope::Ctx)
============================
 [] = [L]
 < apply not_mems to SN _.

Subgoal 1.2.8.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [L] ++ BN = N10
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = [L]
 < search.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 CN BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : CN ++ BN = N10
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : CN = [L]
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N10 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : N10 ++ N11 = N5
SN_P8 : [L] ++ BN = N10
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < App: case SN_P8.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 BN CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = BN
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [] ++ BN = L3
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P9 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P9.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N16 = [] /\
   Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.2.9:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N16 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < A: case SN_P7.

Subgoal 1.2.9.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N16
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case A1.

Subgoal 1.2.9.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35 N36
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name SaveI) N35
E1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (num 1) N36
E2 : N35 ++ N36 = N16
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case E1.

Subgoal 1.2.9.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name SaveI) N35
E2 : N35 ++ [] = N16
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case E.

Subgoal 1.2.9.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [] ++ [] = N16
E : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case E2.

Subgoal 1.2.9.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : [] ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.2.9.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N16
E : not_mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.2.9.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N16
N : not_mem SaveI []
N1 : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.2.9.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N16
N : not_mem SaveI []
N1 : not_mem SaveI [Hold, SaveE, SaveI]
N2 : not_mems SaveI (Scope::Ctx)
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.2.9.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N16
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : not_mem SaveI [SaveE, SaveI]
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N3.

Subgoal 1.2.9.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N16
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : SaveE = SaveI -> false
N4 : not_mem SaveI [SaveI]
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N4.

Subgoal 1.2.9.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E2 : [SaveI] ++ [] = N16
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : SaveE = SaveI -> false
N4 : SaveI = SaveI -> false
N5 : not_mem SaveI []
============================
 N16 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N4 to _.

Subgoal 1.2.9.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : SaveI::N35 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems SaveI ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35
============================
 SaveI::N35 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case A.

Subgoal 1.2.9.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : SaveI::N35 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35
N : not_mem SaveI []
N1 : not_mems SaveI ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 SaveI::N35 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.2.9.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : SaveI::N35 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35
N : not_mem SaveI []
N1 : not_mem SaveI [Hold, SaveE, SaveI]
N2 : not_mems SaveI (Scope::Ctx)
============================
 SaveI::N35 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.2.9.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : SaveI::N35 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : not_mem SaveI [SaveE, SaveI]
============================
 SaveI::N35 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N3.

Subgoal 1.2.9.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : SaveI::N35 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : SaveE = SaveI -> false
N4 : not_mem SaveI [SaveI]
============================
 SaveI::N35 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N4.

Subgoal 1.2.9.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P13 : SaveI::N35 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (minus (name SaveI) (num 1)) N35
N : not_mem SaveI []
N2 : not_mems SaveI (Scope::Ctx)
N1 : Hold = SaveI -> false
N3 : SaveE = SaveI -> false
N4 : SaveI = SaveI -> false
N5 : not_mem SaveI []
============================
 SaveI::N35 = [] /\
 []::([Hold, SaveE, SaveI]::(Scope::Ctx)) = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N4 to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N16 N17 N18 N19 Ctx10 Scope2 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) N16 (Scope2::Ctx10)
SN_P13 : N16 ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames (Scope2::Ctx10) (name L) N18
SN_P14 : stmtNames ((Copy::Scope2)::Ctx10) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N16 = [] /\ Scope2::Ctx10 = []::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N17 N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) [] ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P13 : [] ++ N17 = L3
SN_P15 : N18 ++ N19 = N17
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < case SN_P13.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P7 : stmtNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (minus (name SaveI) (num 1))) [] ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P15 : N18 ++ N19 = L3
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P7.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : N18 ++ N19 = L3
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N18 = [L].

Subgoal 1.2.10:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : N18 ++ N19 = L3
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N18 = [L]
 < E: case SN_P11.

Subgoal 1.2.10.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : mems L ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [L]
 < M': case E.

Subgoal 1.2.10.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L []
============================
 [] = [L]
 < case M'.

Subgoal 1.2.10.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.10.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [Hold, SaveE, SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.10.1.2.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
NotHold : Hold = Hold -> false
NotE : Hold = SaveE -> false
NotCopy : Hold = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : Hold::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign Hold (tail (name Hold))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [Hold]
 < apply NotHold to _.

Subgoal 1.2.10.1.2.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [SaveE, SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.10.1.2.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
NotE : SaveE = SaveE -> false
NotCopy : SaveE = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : SaveE::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign SaveE (tail (name SaveE))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [SaveE]
 < apply NotE to _.

Subgoal 1.2.10.1.2.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.10.1.2.1.2.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveI = SaveI -> false
NotHold : SaveI = Hold -> false
NotE : SaveI = SaveE -> false
NotCopy : SaveI = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : SaveI::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign SaveI (tail (name SaveI))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [SaveI]
 < apply NotI to _.

Subgoal 1.2.10.1.2.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L []
============================
 [] = [L]
 < case M'.

Subgoal 1.2.10.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mems L (Scope::Ctx)
============================
 [] = [L]
 < apply not_mems to SN _.

Subgoal 1.2.10.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [L] ++ N19 = L3
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : not_mems L ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L] = [L]
 < search.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N18 N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : N18 ++ N19 = L3
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N18
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N18 = [L]
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::L3 ++ N11 = N5
SN_P15 : [L] ++ N19 = L3
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) [L]
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < App: case SN_P15.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N19 N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) [L]
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = N19
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [] ++ N19 = L1
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P11 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) [L]
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = L1
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P11.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = L1
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N20 = [] /\
   Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.2.11:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = L1
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N20 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < R: case SN_P14.

Subgoal 1.2.11.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : N20 ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N20
============================
 N20 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case R1.

Subgoal 1.2.11.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : [] ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.2.11.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : [Hold] ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Hold] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.2.11.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : [Hold] ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Hold] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.2.11.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : [Hold] ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 [Hold] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.2.11.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : [Hold] ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 [Hold] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N1 to _.

Subgoal 1.2.11.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : Copy::N35 ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N35
============================
 Copy::N35 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case R.

Subgoal 1.2.11.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : Copy::N35 ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N35
N : not_mem Copy [Copy]
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 Copy::N35 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N.

Subgoal 1.2.11.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P17 : Copy::N35 ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N35
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : Copy = Copy -> false
N2 : not_mem Copy []
============================
 Copy::N35 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N20 Ctx11 N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N20 Ctx11
SN_P17 : N20 ++ N21 = L1
SN_P16 : stmtNames Ctx11 (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N20 = [] /\ Ctx11 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N21 N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P17 : [] ++ N21 = L1
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = N21
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < case SN_P17.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P14 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P14.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N22 = [] /\
   Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.2.12:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N22 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < A: case SN_P16.

Subgoal 1.2.12.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N22
============================
 N22 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case A1.

Subgoal 1.2.12.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : [] ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.2.12.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : [Copy] ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.2.12.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : [Copy] ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Copy [Copy]
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N.

Subgoal 1.2.12.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : [Copy] ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : Copy = Copy -> false
N2 : not_mem Copy []
============================
 [Copy] = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N to _.

Subgoal 1.2.12.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : Hold::N35 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35
============================
 Hold::N35 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case A.

Subgoal 1.2.12.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : Hold::N35 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35
N : not_mem Hold [Copy]
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 Hold::N35 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.2.12.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : Hold::N35 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35
N : not_mem Hold [Copy]
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 Hold::N35 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N1.

Subgoal 1.2.12.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : Hold::N35 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35
N : not_mem Hold [Copy]
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 Hold::N35 = [] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N1 to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N22 Ctx12 N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N22 Ctx12
SN_P18 : stmtNames Ctx12 (assign L (tail (name L))) N23 CtxB
SN_P19 : N22 ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N22 = [] /\ Ctx12 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N23 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) N23 CtxB
SN_P19 : [] ++ N23 = L1
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < case SN_P19.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P16 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) [] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) L1 CtxB
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P16.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) L1 CtxB
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert L1 = [L, L] /\
   CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.2.13:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) L1 CtxB
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 L1 = [L, L] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < A: case SN_P18.

Subgoal 1.2.13.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case A.

Subgoal 1.2.13.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
M' : mem L [Copy]
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.1.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Copy::Names) SaveI
Pr2 : fresh_name "Hold" (Copy::Names) Hold
Pr3 : fresh_name "E" (Copy::Names) SaveE
Pr4 : fresh_name "C" (Copy::Names) Copy
H1 : is_string Copy
H2 : is_expr I
H3 : is_expr E
SN : not_mems Copy (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Copy = SaveI -> false
NotHold : Copy = Hold -> false
NotE : Copy = SaveE -> false
NotCopy : Copy = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : Copy::(Copy::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Copy) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Copy ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Copy)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign Copy (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Copy)) L1
============================
 L1 = [Copy, Copy] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotCopy to _.

Subgoal 1.2.13.1.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
M' : mem L []
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case M'.

Subgoal 1.2.13.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
M' : mem L [Hold, SaveE, SaveI]
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.1.2.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
NotHold : Hold = Hold -> false
NotE : Hold = SaveE -> false
NotCopy : Hold = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : Hold::(Hold::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) L1
============================
 L1 = [Hold, Hold] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotHold to _.

Subgoal 1.2.13.1.2.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
M' : mem L [SaveE, SaveI]
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.1.2.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
NotE : SaveE = SaveE -> false
NotCopy : SaveE = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : SaveE::(SaveE::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name SaveE)) L1
============================
 L1 = [SaveE, SaveE] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotE to _.

Subgoal 1.2.13.1.2.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
M' : mem L [SaveI]
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.1.2.1.2.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveI = SaveI -> false
NotHold : SaveI = Hold -> false
NotE : SaveI = SaveE -> false
NotCopy : SaveI = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : SaveI::(SaveI::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name SaveI)) L1
============================
 L1 = [SaveI, SaveI] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotI to _.

Subgoal 1.2.13.1.2.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
M' : mem L []
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case M'.

Subgoal 1.2.13.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) L1
M' : mems L (Scope::Ctx)
============================
 L1 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply not_mems to _ M'.

Subgoal 1.2.13.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::(L::N35)) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name L)) N35
============================
 L::N35 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case A1.

Subgoal 1.2.13.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::(L::N35)) ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N35
============================
 L::N35 = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case E.

Subgoal 1.2.13.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case E.

Subgoal 1.2.13.2.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L [Copy]
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.2.1.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Copy::Names) SaveI
Pr2 : fresh_name "Hold" (Copy::Names) Hold
Pr3 : fresh_name "E" (Copy::Names) SaveE
Pr4 : fresh_name "C" (Copy::Names) Copy
H1 : is_string Copy
H2 : is_expr I
H3 : is_expr E
SN : not_mems Copy (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Copy = SaveI -> false
NotHold : Copy = Hold -> false
NotE : Copy = SaveE -> false
NotCopy : Copy = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [Copy, Copy, Copy] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Copy) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Copy ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Copy)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign Copy (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Copy] = [Copy, Copy] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotCopy to _.

Subgoal 1.2.13.2.1.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L []
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case M'.

Subgoal 1.2.13.2.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.2.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L [Hold, SaveE, SaveI]
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.2.1.2.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
NotHold : Hold = Hold -> false
NotE : Hold = SaveE -> false
NotCopy : Hold = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [Hold, Hold, Hold] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Hold] = [Hold, Hold] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotHold to _.

Subgoal 1.2.13.2.1.2.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L [SaveE, SaveI]
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.2.1.2.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
NotE : SaveE = SaveE -> false
NotCopy : SaveE = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [SaveE, SaveE, SaveE] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems SaveE ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [SaveE] = [SaveE, SaveE] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotE to _.

Subgoal 1.2.13.2.1.2.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L [SaveI]
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.13.2.1.2.1.2.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveI = SaveI -> false
NotHold : SaveI = Hold -> false
NotE : SaveI = SaveE -> false
NotCopy : SaveI = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [SaveI, SaveI, SaveI] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveI) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems SaveI ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [SaveI] = [SaveI, SaveI] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotI to _.

Subgoal 1.2.13.2.1.2.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L []
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case M'.

Subgoal 1.2.13.2.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mems L (Scope::Ctx)
============================
 [L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply not_mems to _ M'.

Subgoal 1.2.13.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L, L] ++ N11 = N5
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L, L] = [L, L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 CtxB N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : L::(L::L1) ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) L1 CtxB
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : L1 = [L, L] /\ CtxB = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N5 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ N5 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P6 : [L, L, L, L] ++ N11 = N5
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < App: case SN_P6.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::L4 = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [L, L, L] ++ N11 = L4
============================
 mem X (L::N1)
 < App: case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L5
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::L5) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [L, L] ++ N11 = L5
============================
 mem X (L::N1)
 < App: case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L6
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::L6)) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [L] ++ N11 = L6
============================
 mem X (L::N1)
 < App: case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N11 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P21 : N24 ++ N25 = N11
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [] ++ N11 = L7
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P18 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (tail (name L))) [L, L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P21 : N24 ++ N25 = L7
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P18.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert CN1 = [L].

Subgoal 1.2.14:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 CN1 = [L]
 < E: case SN_P5.

Subgoal 1.2.14.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = [L]
 < M': case E.

Subgoal 1.2.14.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [Hold, SaveE, SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.14.1.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
NotHold : Hold = Hold -> false
NotE : Hold = SaveE -> false
NotCopy : Hold = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ Hold::(Hold::(Hold::(Hold::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate Hold ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [Hold]
 < apply NotHold to _.

Subgoal 1.2.14.1.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [SaveE, SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.14.1.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
NotE : SaveE = SaveE -> false
NotCopy : SaveE = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ SaveE::(SaveE::(SaveE::(SaveE::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveE ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [SaveE]
 < apply NotE to _.

Subgoal 1.2.14.1.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L [SaveI]
============================
 [] = [L]
 < M': case M'.

Subgoal 1.2.14.1.1.2.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveI = SaveI -> false
NotHold : SaveI = Hold -> false
NotE : SaveI = SaveE -> false
NotCopy : SaveI = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ SaveI::(SaveI::(SaveI::(SaveI::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate SaveI ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 [] = [SaveI]
 < apply NotI to _.

Subgoal 1.2.14.1.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mem L []
============================
 [] = [L]
 < case M'.

Subgoal 1.2.14.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
M' : mems L (Scope::Ctx)
============================
 [] = [L]
 < apply not_mems to _ M'.

Subgoal 1.2.14.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [L] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = [L]
 < search.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 CN1 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : CN1 ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) CN1
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : CN1 = [L]
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N26 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P24 : [L] ++ [] = N26
SN_P25 : N26 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < App: case SN_P24.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 L8
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P25 : L::L8 ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [] ++ [] = L8
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N24 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : N24 ++ N25 = L7
SN_P25 : [L] ++ [] = N24
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < App: case SN_P25.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7 L9
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : L::L9 ++ N25 = L7
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [] ++ [] = L9
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L7
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::L7))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P21 : [L] ++ N25 = L7
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < App: case SN_P21.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N25 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = N25
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [] ++ N25 = L10
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P5 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name L) [L]
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P5.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N27 = [L] /\
   Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx).

Subgoal 1.2.15:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N27 = [L] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < R: case SN_P20.

Subgoal 1.2.15.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
============================
 N27 = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < M': case R.

Subgoal 1.2.15.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
M' : mem L [Hold, SaveE, SaveI]
============================
 N27 = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < M': case M'.

Subgoal 1.2.15.1.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
NotHold : Hold = Hold -> false
NotE : Hold = SaveE -> false
NotCopy : Hold = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ Hold::(Hold::(Hold::(Hold::(Hold::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name Hold)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign Hold (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
============================
 N27 = [Hold] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < apply NotHold to _.

Subgoal 1.2.15.1.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
M' : mem L [SaveE, SaveI]
============================
 N27 = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < M': case M'.

Subgoal 1.2.15.1.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
NotE : SaveE = SaveE -> false
NotCopy : SaveE = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ SaveE::(SaveE::(SaveE::(SaveE::(SaveE::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name SaveE)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveE (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
============================
 N27 = [SaveE] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < apply NotE to _.

Subgoal 1.2.15.1.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
M' : mem L [SaveI]
============================
 N27 = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < M': case M'.

Subgoal 1.2.15.1.1.2.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveI = SaveI -> false
NotHold : SaveI = Hold -> false
NotE : SaveI = SaveE -> false
NotCopy : SaveI = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ SaveI::(SaveI::(SaveI::(SaveI::(SaveI::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name SaveI)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign SaveI (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
============================
 N27 = [SaveI] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < apply NotI to _.

Subgoal 1.2.15.1.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
M' : mem L []
============================
 N27 = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < case M'.

Subgoal 1.2.15.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N27
M' : mems L (Scope::Ctx)
============================
 N27 = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < apply not_mems to _ M'.

Subgoal 1.2.15.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : L::N35 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
R1 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name SaveE) N35
============================
 L::N35 = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < E: case R1.

Subgoal 1.2.15.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : [L] ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
E : mems SaveE ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L] = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < search.

Subgoal 1.2.15.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : [L, SaveE] ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
E : not_mems SaveE ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L, SaveE] = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < N: case E.

Subgoal 1.2.15.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : [L, SaveE] ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : not_mem SaveE [Hold, SaveE, SaveI]
N1 : not_mems SaveE (Scope::Ctx)
============================
 [L, SaveE] = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < N: case N.

Subgoal 1.2.15.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : [L, SaveE] ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
N1 : not_mems SaveE (Scope::Ctx)
N : Hold = SaveE -> false
N2 : not_mem SaveE [SaveE, SaveI]
============================
 [L, SaveE] = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < N: case N2.

Subgoal 1.2.15.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P23 : [L, SaveE] ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : not_mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
N1 : not_mems SaveE (Scope::Ctx)
N : Hold = SaveE -> false
N2 : SaveE = SaveE -> false
N3 : not_mem SaveE [SaveI]
============================
 [L, SaveE] = [L] /\
 [Hold, SaveE, SaveI]::(Scope::Ctx) = [Hold, SaveE, SaveI]::(Scope::Ctx)
 < apply N2 to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2 N2 N3 N4 N27 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) N27 Ctx2
SN_P23 : N27 ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames Ctx2 (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::Ctx2) (name Hold) N29
SN_P28 : stmtNames ([Copy]::Ctx2) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N27 = [L] /\ Ctx2 = [Hold, SaveE, SaveI]::(Scope::Ctx)
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::L10)))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [L] ([Hold, SaveE, SaveI]::(Scope::Ctx))
SN_P23 : [L] ++ N28 = L10
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < App: case SN_P23.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N28 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [L] ([Hold, SaveE, SaveI]::(Scope::Ctx))
SN_P27 : CN2 ++ BN1 = N28
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [] ++ N28 = L11
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P20 : stmtNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (recUpdate L ["head"] (name SaveE)) [L] ([Hold, SaveE, SaveI]::(Scope::Ctx))
SN_P27 : CN2 ++ BN1 = L11
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P20.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P27 : CN2 ++ BN1 = L11
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert CN2 = [].

Subgoal 1.2.16:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P27 : CN2 ++ BN1 = L11
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 CN2 = []
 < E: case SN_P22.

Subgoal 1.2.16.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P27 : [] ++ BN1 = L11
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = []
 < search.

Subgoal 1.2.16.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P27 : [Hold] ++ BN1 = L11
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Hold] = []
 < N: case E.

Subgoal 1.2.16.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P27 : [Hold] ++ BN1 = L11
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N : not_mem Hold [Hold, SaveE, SaveI]
N1 : not_mems Hold (Scope::Ctx)
============================
 [Hold] = []
 < N: case N.

Subgoal 1.2.16.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P27 : [Hold] ++ BN1 = L11
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N1 : not_mems Hold (Scope::Ctx)
N : Hold = Hold -> false
N2 : not_mem Hold [SaveE, SaveI]
============================
 [Hold] = []
 < apply N to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CN2 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P27 : CN2 ++ BN1 = L11
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) CN2
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : CN2 = []
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 BN1 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P27 : [] ++ BN1 = L11
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) []
SN_P29 : N29 ++ N30 = BN1
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < case SN_P27.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P22 : exprNames ([Hold, SaveE, SaveI]::(Scope::Ctx)) (name Hold) []
SN_P29 : N29 ++ N30 = L11
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P22.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : N29 ++ N30 = L11
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N29 = [].

Subgoal 1.2.17:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : N29 ++ N30 = L11
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N29 = []
 < E: case SN_P26.

Subgoal 1.2.17.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : [] ++ N30 = L11
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : mems Hold ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = []
 < search.

Subgoal 1.2.17.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : [Hold] ++ N30 = L11
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
E : not_mems Hold ([]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Hold] = []
 < N: case E.

Subgoal 1.2.17.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : [Hold] ++ N30 = L11
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N : not_mem Hold []
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Hold] = []
 < N: case N1.

Subgoal 1.2.17.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : [Hold] ++ N30 = L11
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N : not_mem Hold []
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 [Hold] = []
 < N: case N1.

Subgoal 1.2.17.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : [Hold] ++ N30 = L11
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
N : not_mem Hold []
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 [Hold] = []
 < apply N1 to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N29 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : N29 ++ N30 = L11
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) N29
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N29 = []
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N30 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P29 : [] ++ N30 = L11
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) []
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = N30
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < case SN_P29.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P26 : exprNames ([]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) []
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = L11
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < clear SN_P26.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = L11
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < Eq: assert N31 = [L] /\
   Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.2.18:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = L11
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 N31 = [L] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < R: case SN_P28.

Subgoal 1.2.18.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : N31 ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N31
============================
 N31 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case R1.

Subgoal 1.2.18.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case E.

Subgoal 1.2.18.1.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L [Copy]
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.18.1.1.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Copy::Names) SaveI
Pr2 : fresh_name "Hold" (Copy::Names) Hold
Pr3 : fresh_name "E" (Copy::Names) SaveE
Pr4 : fresh_name "C" (Copy::Names) Copy
H1 : is_string Copy
H2 : is_expr I
H3 : is_expr E
SN : not_mems Copy (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Copy = SaveI -> false
NotHold : Copy = Hold -> false
NotE : Copy = SaveE -> false
NotCopy : Copy = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ Copy::(Copy::(Copy::(Copy::(Copy::(Copy::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Copy (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [Copy] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotCopy to _.

Subgoal 1.2.18.1.1.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L []
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case M'.

Subgoal 1.2.18.1.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.18.1.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L [Hold, SaveE, SaveI]
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.18.1.1.2.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
NotHold : Hold = Hold -> false
NotE : Hold = SaveE -> false
NotCopy : Hold = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ Hold::(Hold::(Hold::(Hold::(Hold::(Hold::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [Hold] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotHold to _.

Subgoal 1.2.18.1.1.2.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L [SaveE, SaveI]
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.18.1.1.2.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
NotE : SaveE = SaveE -> false
NotCopy : SaveE = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ SaveE::(SaveE::(SaveE::(SaveE::(SaveE::(SaveE::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveE (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [SaveE] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotE to _.

Subgoal 1.2.18.1.1.2.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L [SaveI]
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.18.1.1.2.1.2.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveI = SaveI -> false
NotHold : SaveI = Hold -> false
NotE : SaveI = SaveE -> false
NotCopy : SaveI = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ SaveI::(SaveI::(SaveI::(SaveI::(SaveI::(SaveI::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign SaveI (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = [SaveI] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotI to _.

Subgoal 1.2.18.1.1.2.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mem L []
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case M'.

Subgoal 1.2.18.1.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
M' : mems L (Scope::Ctx)
============================
 [] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply not_mems to _ M'.

Subgoal 1.2.18.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : [L] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.2.18.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : Copy::N35 ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N35
============================
 Copy::N35 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case R.

Subgoal 1.2.18.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : Copy::N35 ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N35
N : not_mem Copy [Copy]
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 Copy::N35 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N.

Subgoal 1.2.18.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P31 : Copy::N35 ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
R1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name L) N35
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : Copy = Copy -> false
N2 : not_mem Copy []
============================
 Copy::N35 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N31 Ctx16 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) N31 Ctx16
SN_P31 : N31 ++ N32 = L11
SN_P30 : stmtNames Ctx16 (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
Eq : N31 = [L] /\ Ctx16 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L11
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::L11))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P31 : [L] ++ N32 = L11
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
============================
 mem X (L::N1)
 < App: case SN_P31.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N32 N33 Ctx17 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = N32
App : [] ++ N32 = L12
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 Ctx17 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P28 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (recUpdate Copy ["tail"] (name L)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
============================
 mem X (L::N1)
 < clear SN_P28.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 Ctx17 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
============================
 mem X (L::N1)
 < Eq: assert N33 = [L] /\
   Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)).

Subgoal 1.2.19:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 Ctx17 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
============================
 N33 = [L] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < A: case SN_P30.

Subgoal 1.2.19.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A : mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case A.

Subgoal 1.2.19.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
M' : mem L [Copy]
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.19.1.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate Copy I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) (seq (ifThenElse (null (name Copy)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Copy ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Copy::Names) SaveI
Pr2 : fresh_name "Hold" (Copy::Names) Hold
Pr3 : fresh_name "E" (Copy::Names) SaveE
Pr4 : fresh_name "C" (Copy::Names) Copy
H1 : is_string Copy
H2 : is_expr I
H3 : is_expr E
SN : not_mems Copy (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Copy = SaveI -> false
NotHold : Copy = Hold -> false
NotE : Copy = SaveE -> false
NotCopy : Copy = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ Copy::(Copy::(Copy::(Copy::(Copy::(Copy::(Copy::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
============================
 N33 = [Copy] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotCopy to _.

Subgoal 1.2.19.1.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
M' : mem L []
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case M'.

Subgoal 1.2.19.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
M' : mems L ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.19.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
M' : mem L [Hold, SaveE, SaveI]
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.19.1.2.1.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
SN : not_mems Hold (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : Hold = SaveI -> false
NotHold : Hold = Hold -> false
NotE : Hold = SaveE -> false
NotCopy : Hold = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ Hold::(Hold::(Hold::(Hold::(Hold::(Hold::(Hold::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
============================
 N33 = [Hold] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotHold to _.

Subgoal 1.2.19.1.2.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
M' : mem L [SaveE, SaveI]
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.19.1.2.1.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveE (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveE = SaveI -> false
NotHold : SaveE = Hold -> false
NotE : SaveE = SaveE -> false
NotCopy : SaveE = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ SaveE::(SaveE::(SaveE::(SaveE::(SaveE::(SaveE::(SaveE::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
============================
 N33 = [SaveE] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotE to _.

Subgoal 1.2.19.1.2.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
M' : mem L [SaveI]
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < M': case M'.

Subgoal 1.2.19.1.2.1.2.2.1:

Variables: Names Scope Ctx N_P X Hold Copy SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
SN : not_mems SaveI (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : SaveI = SaveI -> false
NotHold : SaveI = Hold -> false
NotE : SaveI = SaveE -> false
NotCopy : SaveI = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ SaveI::(SaveI::(SaveI::(SaveI::(SaveI::(SaveI::(SaveI::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
============================
 N33 = [SaveI] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply NotI to _.

Subgoal 1.2.19.1.2.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
M' : mem L []
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < case M'.

Subgoal 1.2.19.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N33
M' : mems L (Scope::Ctx)
============================
 N33 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply not_mems to _ M'.

Subgoal 1.2.19.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : L::N35 ++ N34 = L12
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Copy) N35
============================
 L::N35 = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < E: case A1.

Subgoal 1.2.19.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : [L] ++ N34 = L12
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < search.

Subgoal 1.2.19.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : [L, Copy] ++ N34 = L12
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems Copy ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [L, Copy] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case E.

Subgoal 1.2.19.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : [L, Copy] ++ N34 = L12
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Copy [Copy]
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [L, Copy] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < N: case N.

Subgoal 1.2.19.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : [L, Copy] ++ N34 = L12
A : not_mems L ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N1 : not_mems Copy ([Hold, SaveE, SaveI]::(Scope::Ctx))
N : Copy = Copy -> false
N2 : not_mem Copy []
============================
 [L, Copy] = [L] /\
 [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)) = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
 < apply N to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N33 Ctx17 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) N33 Ctx17
SN_P32 : stmtNames Ctx17 (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : N33 ++ N34 = L12
Eq : N33 = [L] /\ Ctx17 = [Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::L12)))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
SN_P33 : [L] ++ N34 = L12
============================
 mem X (L::N1)
 < App: case SN_P33.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 N34 L13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) N34 CtxB1
App : [] ++ N34 = L13
============================
 mem X (L::N1)
 < case App.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 L13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P30 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign L (name Copy)) [L] ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) L13 CtxB1
============================
 mem X (L::N1)
 < clear SN_P30.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 L13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) L13 CtxB1
============================
 mem X (L::N1)
 < Eq: assert L13 = [].

Subgoal 1.2.20:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 L13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) L13 CtxB1
============================
 L13 = []
 < A: case SN_P32.

Subgoal 1.2.20.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 L13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) L13
============================
 L13 = []
 < E: case A1.

Subgoal 1.2.20.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 L13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (name Hold) L13
============================
 L13 = []
 < E: case E.

Subgoal 1.2.20.1.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [] = []
 < search.

Subgoal 1.2.20.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L, Hold] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
E : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
============================
 [Hold] = []
 < N: case E.

Subgoal 1.2.20.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L, Hold] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 [Hold] = []
 < N: case N1.

Subgoal 1.2.20.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L, Hold] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 [Hold] = []
 < N: case N1.

Subgoal 1.2.20.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L, Hold] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A : mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
N : not_mem Hold [Copy]
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 [Hold] = []
 < apply N1 to _.

Subgoal 1.2.20.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::(Hold::N35)))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A : not_mems Hold ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx)))
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N35
============================
 Hold::N35 = []
 < N: case A.

Subgoal 1.2.20.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::(Hold::N35)))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N35
N : not_mem Hold [Copy]
N1 : not_mems Hold ([Hold, SaveE, SaveI]::(Scope::Ctx))
============================
 Hold::N35 = []
 < N: case N1.

Subgoal 1.2.20.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::(Hold::N35)))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N35
N : not_mem Hold [Copy]
N1 : not_mem Hold [Hold, SaveE, SaveI]
N2 : not_mems Hold (Scope::Ctx)
============================
 Hold::N35 = []
 < N: case N1.

Subgoal 1.2.20.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 N35
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::(Hold::N35)))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
A1 : exprNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (tail (name Hold)) N35
N : not_mem Hold [Copy]
N2 : not_mems Hold (Scope::Ctx)
N1 : Hold = Hold -> false
N3 : not_mem Hold [SaveE, SaveI]
============================
 Hold::N35 = []
 < apply N1 to _.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1 L13
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ L::(L::(L::(L::(L::(L::(L::(L::L13))))))) = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) L13 CtxB1
Eq : L13 = []
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
SN_P32 : stmtNames ([Copy]::([Hold, SaveE, SaveI]::(Scope::Ctx))) (assign Hold (tail (name Hold))) [] CtxB1
============================
 mem X (L::N1)
 < clear SN_P32.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
============================
 mem X (L::N1)
 < Or: apply mem_append to M SN_P2.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
Or : mem X N2 \/ mem X N3
============================
 mem X (L::N1)
 < M': case Or.

Subgoal 1.2.21:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N2
============================
 mem X (L::N1)
 < MI: apply exprNames_increaseCtxs to _ _ _ _ SN1 SN_PI M'.

Subgoal 1.2.21:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N2
MI : mem X NI
============================
 mem X (L::N1)
 < apply mem_append_left to MI SN3.

Subgoal 1.2.21:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N2
MI : mem X NI
H6 : mem X N1
============================
 mem X (L::N1)
 < search.

Subgoal 1.2.22:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
============================
 mem X (L::N1)
 < Or: apply mem_append to M' SN_P3.

Subgoal 1.2.22:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
Or : mem X N4 \/ mem X [L, L, L, L, L, L, L, L]
============================
 mem X (L::N1)
 < M'': case Or.

Subgoal 1.2.22.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
M'' : mem X N4
============================
 mem X (L::N1)
 < apply fresh_name_is to _ Pr1.

Subgoal 1.2.22.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
M'' : mem X N4
H6 : is_string SaveI
============================
 mem X (L::N1)
 < ME: apply exprNames_increaseCtxs to _ _ _ _ SN2 SN_PE M''.

Subgoal 1.2.22.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
M'' : mem X N4
H6 : is_string SaveI
ME : mem X NE
============================
 mem X (L::N1)
 < apply mem_append_right to ME SN3.

Subgoal 1.2.22.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
M'' : mem X N4
H6 : is_string SaveI
ME : mem X NE
H7 : mem X N1
============================
 mem X (L::N1)
 < search.

Subgoal 1.2.22.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
M'' : mem X [L, L, L, L, L, L, L, L]
============================
 mem X (L::N1)
 < Eq: assert X = L.

Subgoal 1.2.22.2.1:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
M'' : mem X [L, L, L, L, L, L, L, L]
============================
 X = L
 < X: case M''.

Subgoal 1.2.22.2.1.1:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
============================
 L = L
 < search.

Subgoal 1.2.22.2.1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
X : mem X [L, L, L, L, L, L, L]
============================
 X = L
 < X: case X.

Subgoal 1.2.22.2.1.2.1:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
============================
 L = L
 < search.

Subgoal 1.2.22.2.1.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
X : mem X [L, L, L, L, L, L]
============================
 X = L
 < X: case X.

Subgoal 1.2.22.2.1.2.2.1:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
============================
 L = L
 < search.

Subgoal 1.2.22.2.1.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
X : mem X [L, L, L, L, L]
============================
 X = L
 < X: case X.

Subgoal 1.2.22.2.1.2.2.2.1:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
============================
 L = L
 < search.

Subgoal 1.2.22.2.1.2.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
X : mem X [L, L, L, L]
============================
 X = L
 < X: case X.

Subgoal 1.2.22.2.1.2.2.2.2.1:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
============================
 L = L
 < search.

Subgoal 1.2.22.2.1.2.2.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
X : mem X [L, L, L]
============================
 X = L
 < X: case X.

Subgoal 1.2.22.2.1.2.2.2.2.2.1:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
============================
 L = L
 < search.

Subgoal 1.2.22.2.1.2.2.2.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
X : mem X [L, L]
============================
 X = L
 < X: case X.

Subgoal 1.2.22.2.1.2.2.2.2.2.2.1:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
============================
 L = L
 < search.

Subgoal 1.2.22.2.1.2.2.2.2.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
X : mem X [L]
============================
 X = L
 < X: case X.

Subgoal 1.2.22.2.1.2.2.2.2.2.2.2.1:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
============================
 L = L
 < search.

Subgoal 1.2.22.2.1.2.2.2.2.2.2.2.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
X : mem X []
============================
 X = L
 < case X.

Subgoal 1.2.22.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem X N3
M'' : mem X [L, L, L, L, L, L, L, L]
Eq : X = L
============================
 mem X (L::N1)
 < case Eq.

Subgoal 1.2.22.2:

Variables: Names Scope Ctx N_P Hold Copy L SaveE SaveI E I NI NE N1 N2 N3 N4 CtxB1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem L N_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
H4 : is_string SaveI
H5 : is_string Hold
NotI : L = SaveI -> false
NotHold : L = Hold -> false
NotE : L = SaveE -> false
NotCopy : L = Copy -> false
SN_P2 : N2 ++ N3 = N_P
SN_PI : exprNames ([]::(Scope::Ctx)) I N2
SN_P3 : N4 ++ [L, L, L, L, L, L, L, L] = N3
SN_PE : exprNames ([SaveI]::(Scope::Ctx)) E N4
M' : mem L N3
M'' : mem L [L, L, L, L, L, L, L, L]
============================
 mem L (L::N1)
 < search.

Subgoal 2:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X1 L Body)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
============================
 mem X N
 < case IsS.

Subgoal 2:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
============================
 mem X N
 < apply fresh_name_is to _ Pr1.

Subgoal 2:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
============================
 mem X N
 < SN: case SN.

Subgoal 2:

Variables: Names Scope Ctx N N_P Ctx'_P X Body SaveL X1 L NL NB Ctx2
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
============================
 mem X N
 < SN_P: case SN_P.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 Ctx1
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx1
============================
 mem X N
 < SN_P: case SN_P.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 Ctx1 N2 Ctx3 N3
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P : stmtNames ([]::(Scope::Ctx)) (declare intTy SaveL L) N2 Ctx3
SN_P1 : stmtNames Ctx3 (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) N3 Ctx1
SN_P2 : N2 ++ N3 = N_P
============================
 mem X N
 < SN_P: case SN_P.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 Ctx1 N2 N3
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P1 : stmtNames ([SaveL]::(Scope::Ctx)) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) N3 Ctx1
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (not (null (name SaveL))) CN
SN_P3 : stmtNames ([]::([SaveL]::(Scope::Ctx))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)) BN CtxB
SN_P4 : CN ++ BN = N3
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([]::([SaveL]::(Scope::Ctx))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)) BN CtxB
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (null (name SaveL)) CN
============================
 mem X N
 < SN_P: case SN_P1.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([]::([SaveL]::(Scope::Ctx))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)) BN CtxB
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
============================
 mem X N
 < SN_P: case SN_P3.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 Ctx4 N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P3 : stmtNames ([]::([SaveL]::(Scope::Ctx))) (declare intTy X1 (head (name SaveL))) N1 Ctx4
SN_P5 : stmtNames Ctx4 (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : N1 ++ N4 = BN
============================
 mem X N
 < SN_P: case SN_P3.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : N1 ++ N4 = BN
SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (head (name SaveL)) N1
============================
 mem X N
 < SN_P: case SN_P3.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : N1 ++ N4 = BN
SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) N1
============================
 mem X N
 < Eq: assert N1 = [].

Subgoal 2.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : N1 ++ N4 = BN
SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) N1
============================
 N1 = []
 < M': case SN_P3.

Subgoal 2.1.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : [] ++ N4 = BN
M' : mems SaveL ([]::([SaveL]::(Scope::Ctx)))
============================
 [] = []
 < search.

Subgoal 2.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : [SaveL] ++ N4 = BN
M' : not_mems SaveL ([]::([SaveL]::(Scope::Ctx)))
============================
 [SaveL] = []
 < NM: case M'.

Subgoal 2.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : [SaveL] ++ N4 = BN
NM : not_mem SaveL []
NM1 : not_mems SaveL ([SaveL]::(Scope::Ctx))
============================
 [SaveL] = []
 < NM: case NM1.

Subgoal 2.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : [SaveL] ++ N4 = BN
NM : not_mem SaveL []
NM1 : not_mem SaveL [SaveL]
NM2 : not_mems SaveL (Scope::Ctx)
============================
 [SaveL] = []
 < N: case NM1.

Subgoal 2.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : [SaveL] ++ N4 = BN
NM : not_mem SaveL []
NM2 : not_mems SaveL (Scope::Ctx)
N : SaveL = SaveL -> false
N1 : not_mem SaveL []
============================
 [SaveL] = []
 < apply N to _.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N1 N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : N1 ++ N4 = BN
SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) N1
Eq : N1 = []
============================
 mem X N
 < case Eq.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB N4
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N4 CtxB
SN_P6 : [] ++ N4 = BN
SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) []
============================
 mem X N
 < case SN_P6.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
SN_P3 : exprNames ([]::([SaveL]::(Scope::Ctx))) (name SaveL) []
============================
 mem X N
 < clear SN_P3.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
============================
 mem X N
 < Eq: assert CN = [].

Subgoal 2.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
============================
 CN = []
 < M': case SN_P1.

Subgoal 2.2.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : [] ++ BN = N3
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
M' : mems SaveL ([SaveL]::(Scope::Ctx))
============================
 [] = []
 < search.

Subgoal 2.2.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : [SaveL] ++ BN = N3
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
M' : not_mems SaveL ([SaveL]::(Scope::Ctx))
============================
 [SaveL] = []
 < NM: case M'.

Subgoal 2.2.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : [SaveL] ++ BN = N3
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
NM : not_mem SaveL [SaveL]
NM1 : not_mems SaveL (Scope::Ctx)
============================
 [SaveL] = []
 < NM: case NM.

Subgoal 2.2.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : [SaveL] ++ BN = N3
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
NM1 : not_mems SaveL (Scope::Ctx)
NM : SaveL = SaveL -> false
NM2 : not_mem SaveL []
============================
 [SaveL] = []
 < apply NM to _.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CN BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : CN ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) CN
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
Eq : CN = []
============================
 mem X N
 < case Eq.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 BN CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P4 : [] ++ BN = N3
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) []
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) BN CtxB
============================
 mem X N
 < case SN_P4.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : exprNames ([SaveL]::(Scope::Ctx)) (name SaveL) []
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N3 CtxB
============================
 mem X N
 < clear SN_P1.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P5 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (seq (assign SaveL (tail (name SaveL))) Body) N3 CtxB
============================
 mem X N
 < SN_P: case SN_P5.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 Ctx5 N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) N5 Ctx5
SN_P3 : stmtNames Ctx5 Body N6 CtxB
SN_P4 : N5 ++ N6 = N3
============================
 mem X N
 < Eq: assert N5 = [] /\
   Ctx5 = [X1]::([SaveL]::(Scope::Ctx)).

Subgoal 2.3:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 Ctx5 N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) N5 Ctx5
SN_P3 : stmtNames Ctx5 Body N6 CtxB
SN_P4 : N5 ++ N6 = N3
============================
 N5 = [] /\ Ctx5 = [X1]::([SaveL]::(Scope::Ctx))
 < A: case SN_P1.

Subgoal 2.3.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : N5 ++ N6 = N3
A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N5
============================
 N5 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < A: case A1.

Subgoal 2.3.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : N5 ++ N6 = N3
A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (name SaveL) N5
============================
 N5 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < MA: case A1.

Subgoal 2.3.1.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : [] ++ N6 = N3
A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
MA : mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
============================
 [] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < search.

Subgoal 2.3.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : [SaveL] ++ N6 = N3
A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
MA : not_mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
============================
 [SaveL] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < NM: case MA.

Subgoal 2.3.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : [SaveL] ++ N6 = N3
A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
NM : not_mem SaveL [X1]
NM1 : not_mems SaveL ([SaveL]::(Scope::Ctx))
============================
 [SaveL] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < NM: case NM1.

Subgoal 2.3.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : [SaveL] ++ N6 = N3
A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
NM : not_mem SaveL [X1]
NM1 : not_mem SaveL [SaveL]
NM2 : not_mems SaveL (Scope::Ctx)
============================
 [SaveL] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < NM': case NM1.

Subgoal 2.3.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : [SaveL] ++ N6 = N3
A : mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
NM : not_mem SaveL [X1]
NM2 : not_mems SaveL (Scope::Ctx)
NM' : SaveL = SaveL -> false
NM'1 : not_mem SaveL []
============================
 [SaveL] = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < apply NM' to _.

Subgoal 2.3.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 N7
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : SaveL::N7 ++ N6 = N3
A : not_mems SaveL ([X1]::([SaveL]::(Scope::Ctx)))
A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N7
============================
 SaveL::N7 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < NM: case A.

Subgoal 2.3.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 N7
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : SaveL::N7 ++ N6 = N3
A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N7
NM : not_mem SaveL [X1]
NM1 : not_mems SaveL ([SaveL]::(Scope::Ctx))
============================
 SaveL::N7 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < NM: case NM1.

Subgoal 2.3.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 N7
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : SaveL::N7 ++ N6 = N3
A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N7
NM : not_mem SaveL [X1]
NM1 : not_mem SaveL [SaveL]
NM2 : not_mems SaveL (Scope::Ctx)
============================
 SaveL::N7 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < NM': case NM1.

Subgoal 2.3.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6 N7
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : SaveL::N7 ++ N6 = N3
A1 : exprNames ([X1]::([SaveL]::(Scope::Ctx))) (tail (name SaveL)) N7
NM : not_mem SaveL [X1]
NM2 : not_mems SaveL (Scope::Ctx)
NM' : SaveL = SaveL -> false
NM'1 : not_mem SaveL []
============================
 SaveL::N7 = [] /\ [X1]::([SaveL]::(Scope::Ctx)) = [X1]::([SaveL]::(Scope::Ctx))
 < apply NM' to _.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N5 Ctx5 N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) N5 Ctx5
SN_P3 : stmtNames Ctx5 Body N6 CtxB
SN_P4 : N5 ++ N6 = N3
Eq : N5 = [] /\ Ctx5 = [X1]::([SaveL]::(Scope::Ctx))
============================
 mem X N
 < case Eq.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB N6
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N6 CtxB
SN_P4 : [] ++ N6 = N3
============================
 mem X N
 < case SN_P4.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
============================
 mem X N
 < Or: apply mem_append to M SN_P2.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
Or : mem X N2 \/ mem X N3
============================
 mem X N
 < M': case Or.

Subgoal 2.4:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N2
============================
 mem X N
 < ML: apply exprNames_increaseCtxs to _ _ _ _ SN SN_P M'.

Subgoal 2.4:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N2
ML : mem X NL
============================
 mem X N
 < apply mem_append_left to ML SN2.

Subgoal 2.4:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N2
ML : mem X NL
H5 : mem X N
============================
 mem X N
 < search.

Subgoal 2.5:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
============================
 mem X N
 < MB: apply stmtNames_increaseCtxs to _ _ _ _ SN1 SN_P3 M'.

Subgoal 2.5.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
============================
 forall X2,
   mems X2 ([X1]::(Scope::Ctx)) -> mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
 < intros Ms.

Subgoal 2.5.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB X2
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
Ms : mems X2 ([X1]::(Scope::Ctx))
============================
 mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
 < Ms: case Ms.

Subgoal 2.5.1.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB X2
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
Ms : mem X2 [X1]
============================
 mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
 < M'': case Ms.

Subgoal 2.5.1.1.1:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
============================
 mems X1 ([X1]::([SaveL]::(Scope::Ctx)))
 < search.

Subgoal 2.5.1.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB X2
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
M'' : mem X2 []
============================
 mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
 < case M''.

Subgoal 2.5.1.2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB X2
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
Ms : mems X2 (Scope::Ctx)
============================
 mems X2 ([X1]::([SaveL]::(Scope::Ctx)))
 < search.

Subgoal 2.5:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
MB : mem X NB
============================
 mem X N
 < apply mem_append_right to MB SN2.

Subgoal 2.5:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L NL NB Ctx2 N2 N3 CtxB
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
Pr1 : fresh_name "L" (X1::Names) SaveL
H1 : is_string X1
H2 : is_expr L
H3 : is_stmt Body
H4 : is_string SaveL
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx2
SN2 : NL ++ NB = N
SN_P2 : N2 ++ N3 = N_P
SN_P : exprNames ([]::(Scope::Ctx)) L N2
SN_P1 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) (assign SaveL (tail (name SaveL))) [] ([X1]::([SaveL]::(Scope::Ctx)))
SN_P3 : stmtNames ([X1]::([SaveL]::(Scope::Ctx))) Body N3 CtxB
M' : mem X N3
MB : mem X NB
H5 : mem X N
============================
 mem X N
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmtNames_names_forward.

Subgoal 1:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
============================
 mems X Ctx'_P
 < apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string SaveI
============================
 mems X Ctx'_P
 < apply fresh_name_is to _ Pr2.

Subgoal 1.1:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string SaveI
H2 : is_string Hold
============================
 mems X Ctx'_P
 < SN: case SN.

Subgoal 1.2:

Variables: Names Scope Ctx N N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X (Scope::Ctx)
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string SaveI
H2 : is_string Hold
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
============================
 mems X Ctx'_P
 < SN_P: case SN_P.

Subgoal 1.2:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mems X (Scope::Ctx)
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string SaveI
H2 : is_string Hold
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2
============================
 mems X (Scope::Ctx)
 < search.

Subgoal 1.3:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X (Scope::Ctx)
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string SaveI
H2 : is_string Hold
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
============================
 mems X Ctx'_P
 < SN_P: case SN_P.

Subgoal 1.3:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mems X (Scope::Ctx)
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string SaveI
H2 : is_string Hold
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2
============================
 mems X (Scope::Ctx)
 < search.

Subgoal 2:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X1 L Body)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P
M : mems X Ctx'
Pr1 : fresh_name "L" (X1::Names) SaveL
============================
 mems X Ctx'_P
 < SN_P: case SN_P.

Subgoal 2:

Variables: Names Scope Ctx N Ctx' N_P X Body SaveL X1 L Ctx2
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X1 L Body)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx'
M : mems X Ctx'
Pr1 : fresh_name "L" (X1::Names) SaveL
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx2
============================
 mems X (Scope::Ctx)
 < SN: case SN.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L Ctx2 NL NB Ctx1
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X1 L Body)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mems X (Scope::Ctx)
Pr1 : fresh_name "L" (X1::Names) SaveL
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx2
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx1
SN2 : NL ++ NB = N
============================
 mems X (Scope::Ctx)
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmtNames_names_backward.

Subgoal 1:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listUpdate L I E) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X Ctx'_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
============================
 mems X Ctx'
 < SN: case SN.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X Ctx'_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
============================
 mems X (Scope::Ctx)
 < SN_P: case SN_P.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Hold Copy L SaveE SaveI E I NI NE Ctx2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mems X (Scope::Ctx)
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
SN : mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2
============================
 mems X (Scope::Ctx)
 < search.

Subgoal 1.2:

Variables: Names Scope Ctx N_P Ctx'_P X Hold Copy L SaveE SaveI E I NI NE N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) N_P Ctx'_P
M : mems X Ctx'_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
============================
 mems X (Scope::Ctx)
 < SN_P: case SN_P.

Subgoal 1.2:

Variables: Names Scope Ctx N_P X Hold Copy L SaveE SaveI E I NI NE N1 Ctx2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
IsS : is_stmt (listUpdate L I E)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mems X (Scope::Ctx)
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
SN : not_mems L (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) I NI
SN2 : exprNames (Scope::Ctx) E NE
SN3 : NI ++ NE = N1
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) N_P Ctx2
============================
 mems X (Scope::Ctx)
 < search.

Subgoal 2:

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Body SaveL X1 L
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X1 L Body)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx'
SN_P : stmtNames (Scope::Ctx) (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) N_P Ctx'_P
M : mems X Ctx'_P
Pr1 : fresh_name "L" (X1::Names) SaveL
============================
 mems X Ctx'
 < SN_P: case SN_P.

Subgoal 2:

Variables: Names Scope Ctx N Ctx' N_P X Body SaveL X1 L Ctx2
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X1 L Body)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (listForeach X1 L Body) N Ctx'
M : mems X (Scope::Ctx)
Pr1 : fresh_name "L" (X1::Names) SaveL
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx2
============================
 mems X Ctx'
 < SN: case SN.

Subgoal 2:

Variables: Names Scope Ctx N N_P X Body SaveL X1 L Ctx2 NL NB Ctx1
Pr : Names |{stmt}- listForeach X1 L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
IsS : is_stmt (listForeach X1 L Body)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mems X (Scope::Ctx)
Pr1 : fresh_name "L" (X1::Names) SaveL
SN_P : stmtNames ([]::(Scope::Ctx)) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X1 (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) N_P Ctx2
SN : exprNames (Scope::Ctx) L NL
SN1 : stmtNames ([X1]::(Scope::Ctx)) Body NB Ctx1
SN2 : NL ++ NB = N
============================
 mems X (Scope::Ctx)
 < search.

Proof completed.
 < Prove exactEval:host:typeOf_isTy,
         exactEval:host:stmtOK_isCtx.

Subgoal 1.23:

Variables: FT ET Ty1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsE : is_expr (nil Ty1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (nil Ty1) (listTy Ty1) @
============================
 is_typ (listTy Ty1)
 < case IsE.

Subgoal 1.23:

Variables: FT ET Ty1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (nil Ty1) (listTy Ty1) @
H1 : is_typ Ty1
============================
 is_typ (listTy Ty1)
 < search.

Subgoal 1.24:

Variables: FT ET Ty1 E2 E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsE : is_expr (cons E1 E2)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (cons E1 E2) (listTy Ty1) @
Ty1 : typeOf FT ET E1 Ty1 *
Ty2 : typeOf FT ET E2 (listTy Ty1) *
============================
 is_typ (listTy Ty1)
 < case IsE.

Subgoal 1.24:

Variables: FT ET Ty1 E2 E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (cons E1 E2) (listTy Ty1) @
Ty1 : typeOf FT ET E1 Ty1 *
Ty2 : typeOf FT ET E2 (listTy Ty1) *
H1 : is_expr E1
H2 : is_expr E2
============================
 is_typ (listTy Ty1)
 < apply IH to _ _ _ Ty1.

Subgoal 1.24:

Variables: FT ET Ty1 E2 E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (cons E1 E2) (listTy Ty1) @
Ty1 : typeOf FT ET E1 Ty1 *
Ty2 : typeOf FT ET E2 (listTy Ty1) *
H1 : is_expr E1
H2 : is_expr E2
H3 : is_typ Ty1
============================
 is_typ (listTy Ty1)
 < search.

Subgoal 1.25:

Variables: FT ET Ty E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsE : is_expr (head E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (head E1) Ty @
Ty1 : typeOf FT ET E1 (listTy Ty) *
============================
 is_typ Ty
 < case IsE.

Subgoal 1.25:

Variables: FT ET Ty E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (head E1) Ty @
Ty1 : typeOf FT ET E1 (listTy Ty) *
H1 : is_expr E1
============================
 is_typ Ty
 < Is: apply IH to _ _ _ Ty1.

Subgoal 1.25:

Variables: FT ET Ty E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (head E1) Ty @
Ty1 : typeOf FT ET E1 (listTy Ty) *
H1 : is_expr E1
Is : is_typ (listTy Ty)
============================
 is_typ Ty
 < case Is.

Subgoal 1.25:

Variables: FT ET Ty E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (head E1) Ty @
Ty1 : typeOf FT ET E1 (listTy Ty) *
H1 : is_expr E1
H2 : is_typ Ty
============================
 is_typ Ty
 < search.

Subgoal 1.26:

Variables: FT ET Ty1 E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsE : is_expr (tail E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (tail E1) (listTy Ty1) @
Ty1 : typeOf FT ET E1 (listTy Ty1) *
============================
 is_typ (listTy Ty1)
 < case IsE.

Subgoal 1.26:

Variables: FT ET Ty1 E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (tail E1) (listTy Ty1) @
Ty1 : typeOf FT ET E1 (listTy Ty1) *
H1 : is_expr E1
============================
 is_typ (listTy Ty1)
 < apply IH to _ _ _ Ty1.

Subgoal 1.26:

Variables: FT ET Ty1 E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (tail E1) (listTy Ty1) @
Ty1 : typeOf FT ET E1 (listTy Ty1) *
H1 : is_expr E1
H2 : is_typ (listTy Ty1)
============================
 is_typ (listTy Ty1)
 < search.

Subgoal 1.27:

Variables: FT ET Ty1 E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsE : is_expr (null E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (null E1) boolTy @
Ty1 : typeOf FT ET E1 (listTy Ty1) *
============================
 is_typ boolTy
 < search.

Subgoal 1.28:

Variables: FT ET Ty I L
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsE : is_expr (index L I)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (index L I) Ty @
Ty1 : typeOf FT ET L (listTy Ty) *
Ty2 : typeOf FT ET I intTy *
============================
 is_typ Ty
 < case IsE.

Subgoal 1.28:

Variables: FT ET Ty I L
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (index L I) Ty @
Ty1 : typeOf FT ET L (listTy Ty) *
Ty2 : typeOf FT ET I intTy *
H1 : is_expr L
H2 : is_expr I
============================
 is_typ Ty
 < Is: apply IH to _ _ _ Ty1.

Subgoal 1.28:

Variables: FT ET Ty I L
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (index L I) Ty @
Ty1 : typeOf FT ET L (listTy Ty) *
Ty2 : typeOf FT ET I intTy *
H1 : is_expr L
H2 : is_expr I
Is : is_typ (listTy Ty)
============================
 is_typ Ty
 < case Is.

Subgoal 1.28:

Variables: FT ET Ty I L
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (index L I) Ty @
Ty1 : typeOf FT ET L (listTy Ty) *
Ty2 : typeOf FT ET I intTy *
H1 : is_expr L
H2 : is_expr I
H3 : is_typ Ty
============================
 is_typ Ty
 < search.

Subgoal 1.29:

Variables: FT ET Ty1 E1
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsE : is_expr (exactEval:list:length E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
Ty : typeOf FT ET (exactEval:list:length E1) intTy @
Ty1 : typeOf FT ET E1 (listTy Ty1) *
============================
 is_typ intTy
 < search.

Subgoal 2.12:

Variables: FT ET' Ty E I L
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsS : is_stmt (listUpdate L I E)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
Ty : stmtOK FT ET' (listUpdate L I E) ET' @
Ty1 : lookupScopes L ET' (listTy Ty)
Ty2 : typeOf FT ET' I intTy *
Ty3 : typeOf FT ET' E Ty *
============================
 is_list (is_list (is_pair is_string is_typ)) ET'
 < search.

Subgoal 2.13:

Variables: FT ET' Ty TC1 Body L X
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsS : is_stmt (listForeach X L Body)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
Ty : stmtOK FT ET' (listForeach X L Body) ET' @
Ty1 : typeOf FT ET' L (listTy Ty) *
Ty2 : stmtOK FT ([(X, Ty)]::ET') Body TC1 *
============================
 is_list (is_list (is_pair is_string is_typ)) ET'
 < search.

Proof completed.
 < Prove exactEval:host:stmtOK_keep_scopes.

Subgoal 12:

Variables: FT ET' N Ty E I L
IH : forall FT ET S ET' N,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
       length ET N -> length ET' N
IsS : is_stmt (listUpdate L I E)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
Ty : stmtOK FT ET' (listUpdate L I E) ET' @
L : length ET' N
Ty1 : lookupScopes L ET' (listTy Ty)
Ty2 : typeOf FT ET' I intTy *
Ty3 : typeOf FT ET' E Ty *
============================
 length ET' N
 < search.

Subgoal 13:

Variables: FT ET' N Ty TC1 Body L X
IH : forall FT ET S ET' N,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
       length ET N -> length ET' N
IsS : is_stmt (listForeach X L Body)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
Ty : stmtOK FT ET' (listForeach X L Body) ET' @
L : length ET' N
Ty1 : typeOf FT ET' L (listTy Ty) *
Ty2 : stmtOK FT ([(X, Ty)]::ET') Body TC1 *
============================
 length ET' N
 < search.

Proof completed.
 < Prove exactEval:host:stmtOK_older_scopes_same.

Subgoal 12:

Variables: FT ET Scope Ty E I L
IH : forall FT ET S ET' Scope,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * ->
       exists Scope', ET' = Scope'::ET
IsS : is_stmt (listUpdate L I E)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET)
Ty : stmtOK FT (Scope::ET) (listUpdate L I E) (Scope::ET) @
Ty1 : lookupScopes L (Scope::ET) (listTy Ty)
Ty2 : typeOf FT (Scope::ET) I intTy *
Ty3 : typeOf FT (Scope::ET) E Ty *
============================
 exists Scope', Scope::ET = Scope'::ET
 < search.

Subgoal 13:

Variables: FT ET Scope Ty TC1 Body L X
IH : forall FT ET S ET' Scope,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * ->
       exists Scope', ET' = Scope'::ET
IsS : is_stmt (listForeach X L Body)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET)
Ty : stmtOK FT (Scope::ET) (listForeach X L Body) (Scope::ET) @
Ty1 : typeOf FT (Scope::ET) L (listTy Ty) *
Ty2 : stmtOK FT ([(X, Ty)]::(Scope::ET)) Body TC1 *
============================
 exists Scope', Scope::ET = Scope'::ET
 < search.

Proof completed.
 < Prove exactEval:host:stmtOK_first_scope_lookup_same.

Subgoal 12:

Variables: FT ET Scope' X Ty Ty1 E I L
IH : forall FT ET S Scope Scope' X Ty,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * ->
       lookup Scope X Ty -> lookup Scope' X Ty
IsS : is_stmt (listUpdate L I E)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET)
Ty : stmtOK FT (Scope'::ET) (listUpdate L I E) (Scope'::ET) @
L : lookup Scope' X Ty
Ty1 : lookupScopes L (Scope'::ET) (listTy Ty1)
Ty2 : typeOf FT (Scope'::ET) I intTy *
Ty3 : typeOf FT (Scope'::ET) E Ty1 *
============================
 lookup Scope' X Ty
 < search.

Subgoal 13:

Variables: FT ET Scope' X Ty Ty1 TC1 Body L X1
IH : forall FT ET S Scope Scope' X Ty,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * ->
       lookup Scope X Ty -> lookup Scope' X Ty
IsS : is_stmt (listForeach X1 L Body)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET)
Ty : stmtOK FT (Scope'::ET) (listForeach X1 L Body) (Scope'::ET) @
L : lookup Scope' X Ty
Ty1 : typeOf FT (Scope'::ET) L (listTy Ty1) *
Ty2 : stmtOK FT ([(X1, Ty1)]::(Scope'::ET)) Body TC1 *
============================
 lookup Scope' X Ty
 < search.

Proof completed.
 < Prove exactEval:host:typeOf_unique,
         exactEval:host:stmtOK_unique.

Subgoal 1.23:

Variables: FT ET_A ET_B TyB Ty
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (nil Ty)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (nil Ty) (listTy Ty) @
TyB : typeOf FT ET_B (nil Ty) TyB
Lkp : lookup_all_scopes ET_A ET_B
============================
 listTy Ty = TyB
 < case TyB.

Subgoal 1.23:

Variables: FT ET_A ET_B Ty
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (nil Ty)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (nil Ty) (listTy Ty) @
Lkp : lookup_all_scopes ET_A ET_B
============================
 listTy Ty = listTy Ty
 < search.

Subgoal 1.24:

Variables: FT ET_A ET_B TyB Ty E2 E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (cons E1 E2)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (cons E1 E2) (listTy Ty) @
TyB : typeOf FT ET_B (cons E1 E2) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 Ty *
TyA2 : typeOf FT ET_A E2 (listTy Ty) *
============================
 listTy Ty = TyB
 < case IsE.

Subgoal 1.24:

Variables: FT ET_A ET_B TyB Ty E2 E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (cons E1 E2) (listTy Ty) @
TyB : typeOf FT ET_B (cons E1 E2) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 Ty *
TyA2 : typeOf FT ET_A E2 (listTy Ty) *
H1 : is_expr E1
H2 : is_expr E2
============================
 listTy Ty = TyB
 < TyB: case TyB.

Subgoal 1.24:

Variables: FT ET_A ET_B Ty E2 E1 Ty1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (cons E1 E2) (listTy Ty) @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 Ty *
TyA2 : typeOf FT ET_A E2 (listTy Ty) *
H1 : is_expr E1
H2 : is_expr E2
TyB : typeOf FT ET_B E1 Ty1
TyB1 : typeOf FT ET_B E2 (listTy Ty1)
============================
 listTy Ty = listTy Ty1
 < apply IH_E to _ _ _ _ TyA1 TyB _.

Subgoal 1.24:

Variables: FT ET_A ET_B E2 E1 Ty1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (cons E1 E2) (listTy Ty1) @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 Ty1 *
TyA2 : typeOf FT ET_A E2 (listTy Ty1) *
H1 : is_expr E1
H2 : is_expr E2
TyB : typeOf FT ET_B E1 Ty1
TyB1 : typeOf FT ET_B E2 (listTy Ty1)
============================
 listTy Ty1 = listTy Ty1
 < search.

Subgoal 1.25:

Variables: FT ET_A ET_B TyA TyB E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (head E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (head E1) TyA @
TyB : typeOf FT ET_B (head E1) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy TyA) *
============================
 TyA = TyB
 < case IsE.

Subgoal 1.25:

Variables: FT ET_A ET_B TyA TyB E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (head E1) TyA @
TyB : typeOf FT ET_B (head E1) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy TyA) *
H1 : is_expr E1
============================
 TyA = TyB
 < TyB: case TyB.

Subgoal 1.25:

Variables: FT ET_A ET_B TyA TyB E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (head E1) TyA @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy TyA) *
H1 : is_expr E1
TyB : typeOf FT ET_B E1 (listTy TyB)
============================
 TyA = TyB
 < apply IH_E to _ _ _ _ TyA1 TyB _.

Subgoal 1.25:

Variables: FT ET_A ET_B TyB E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (head E1) TyB @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy TyB) *
H1 : is_expr E1
TyB : typeOf FT ET_B E1 (listTy TyB)
============================
 TyB = TyB
 < search.

Subgoal 1.26:

Variables: FT ET_A ET_B TyB Ty E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (tail E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (tail E1) (listTy Ty) @
TyB : typeOf FT ET_B (tail E1) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
============================
 listTy Ty = TyB
 < case IsE.

Subgoal 1.26:

Variables: FT ET_A ET_B TyB Ty E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (tail E1) (listTy Ty) @
TyB : typeOf FT ET_B (tail E1) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
H1 : is_expr E1
============================
 listTy Ty = TyB
 < TyB: case TyB.

Subgoal 1.26:

Variables: FT ET_A ET_B Ty E1 Ty1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (tail E1) (listTy Ty) @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
H1 : is_expr E1
TyB : typeOf FT ET_B E1 (listTy Ty1)
============================
 listTy Ty = listTy Ty1
 < apply IH_E to _ _ _ _ TyA1 TyB _.

Subgoal 1.26:

Variables: FT ET_A ET_B E1 Ty1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (tail E1) (listTy Ty1) @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty1) *
H1 : is_expr E1
TyB : typeOf FT ET_B E1 (listTy Ty1)
============================
 listTy Ty1 = listTy Ty1
 < search.

Subgoal 1.27:

Variables: FT ET_A ET_B TyB Ty E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (null E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (null E1) boolTy @
TyB : typeOf FT ET_B (null E1) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
============================
 boolTy = TyB
 < case IsE.

Subgoal 1.27:

Variables: FT ET_A ET_B TyB Ty E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (null E1) boolTy @
TyB : typeOf FT ET_B (null E1) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
H1 : is_expr E1
============================
 boolTy = TyB
 < TyB: case TyB.

Subgoal 1.27:

Variables: FT ET_A ET_B Ty E1 Ty1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (null E1) boolTy @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
H1 : is_expr E1
TyB : typeOf FT ET_B E1 (listTy Ty1)
============================
 boolTy = boolTy
 < search.

Subgoal 1.28:

Variables: FT ET_A ET_B TyA TyB I L
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (index L I)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (index L I) TyA @
TyB : typeOf FT ET_B (index L I) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A L (listTy TyA) *
TyA2 : typeOf FT ET_A I intTy *
============================
 TyA = TyB
 < case IsE.

Subgoal 1.28:

Variables: FT ET_A ET_B TyA TyB I L
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (index L I) TyA @
TyB : typeOf FT ET_B (index L I) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A L (listTy TyA) *
TyA2 : typeOf FT ET_A I intTy *
H1 : is_expr L
H2 : is_expr I
============================
 TyA = TyB
 < TyB: case TyB.

Subgoal 1.28:

Variables: FT ET_A ET_B TyA TyB I L
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (index L I) TyA @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A L (listTy TyA) *
TyA2 : typeOf FT ET_A I intTy *
H1 : is_expr L
H2 : is_expr I
TyB : typeOf FT ET_B L (listTy TyB)
TyB1 : typeOf FT ET_B I intTy
============================
 TyA = TyB
 < apply IH_E to _ _ _ _ TyA1 TyB _.

Subgoal 1.28:

Variables: FT ET_A ET_B TyB I L
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (index L I) TyB @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A L (listTy TyB) *
TyA2 : typeOf FT ET_A I intTy *
H1 : is_expr L
H2 : is_expr I
TyB : typeOf FT ET_B L (listTy TyB)
TyB1 : typeOf FT ET_B I intTy
============================
 TyB = TyB
 < search.

Subgoal 1.29:

Variables: FT ET_A ET_B TyB Ty E1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (exactEval:list:length E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (exactEval:list:length E1) intTy @
TyB : typeOf FT ET_B (exactEval:list:length E1) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
============================
 intTy = TyB
 < case TyB.

Subgoal 1.29:

Variables: FT ET_A ET_B Ty E1 Ty1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsE : is_expr (exactEval:list:length E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : typeOf FT ET_A (exactEval:list:length E1) intTy @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
H1 : typeOf FT ET_B E1 (listTy Ty1)
============================
 intTy = intTy
 < search.

Subgoal 2.12:

Variables: FT ET_B ET_A' ET_B' Ty E I L
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsS : is_stmt (listUpdate L I E)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A'
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : stmtOK FT ET_A' (listUpdate L I E) ET_A' @
TyB : stmtOK FT ET_B (listUpdate L I E) ET_B'
Lkp : lookup_all_scopes ET_A' ET_B
TyA1 : lookupScopes L ET_A' (listTy Ty)
TyA2 : typeOf FT ET_A' I intTy *
TyA3 : typeOf FT ET_A' E Ty *
============================
 lookup_all_scopes ET_A' ET_B'
 < case TyB.

Subgoal 2.12:

Variables: FT ET_A' ET_B' Ty E I L Ty1
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsS : is_stmt (listUpdate L I E)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A'
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B'
TyA : stmtOK FT ET_A' (listUpdate L I E) ET_A' @
Lkp : lookup_all_scopes ET_A' ET_B'
TyA1 : lookupScopes L ET_A' (listTy Ty)
TyA2 : typeOf FT ET_A' I intTy *
TyA3 : typeOf FT ET_A' E Ty *
H1 : lookupScopes L ET_B' (listTy Ty1)
H2 : typeOf FT ET_B' I intTy
H3 : typeOf FT ET_B' E Ty1
============================
 lookup_all_scopes ET_A' ET_B'
 < search.

Subgoal 2.13:

Variables: FT ET_B ET_A' ET_B' Ty TC1 Body L X
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsS : is_stmt (listForeach X L Body)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A'
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : stmtOK FT ET_A' (listForeach X L Body) ET_A' @
TyB : stmtOK FT ET_B (listForeach X L Body) ET_B'
Lkp : lookup_all_scopes ET_A' ET_B
TyA1 : typeOf FT ET_A' L (listTy Ty) *
TyA2 : stmtOK FT ([(X, Ty)]::ET_A') Body TC1 *
============================
 lookup_all_scopes ET_A' ET_B'
 < TyB: case TyB.

Subgoal 2.13:

Variables: FT ET_A' ET_B' Ty TC1 Body L X Ty1 TC2
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsS : is_stmt (listForeach X L Body)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A'
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B'
TyA : stmtOK FT ET_A' (listForeach X L Body) ET_A' @
Lkp : lookup_all_scopes ET_A' ET_B'
TyA1 : typeOf FT ET_A' L (listTy Ty) *
TyA2 : stmtOK FT ([(X, Ty)]::ET_A') Body TC1 *
TyB : typeOf FT ET_B' L (listTy Ty1)
TyB1 : stmtOK FT ([(X, Ty1)]::ET_B') Body TC2
============================
 lookup_all_scopes ET_A' ET_B'
 < search.

Proof completed.
 < Prove exactEval:host:paramTy_is.

Proof completed.
 < Prove exactEval:host:getFunInfo_is.

Proof completed.
 < Prove exactEval:host:paramTy_exists.

Proof completed.
 < Prove exactEval:host:getFunInfo_exists.

Proof completed.
 < Theorem listIndex_is :
     forall L I V, is_value L -> listIndex L I V -> is_value V.

============================
 forall L I V, is_value L -> listIndex L I V -> is_value V
 < induction on 2.

IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
============================
 forall L I V, is_value L -> listIndex L I V @ -> is_value V
 < intros Is LI.

Variables: L I V
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
Is : is_value L
LI : listIndex L I V @
============================
 is_value V
 < LI: case LI.

Subgoal 1:

Variables: V Fields
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
Is : is_value (recVal Fields)
LI : lookup Fields "head" V
============================
 is_value V
 < case Is.

Subgoal 1:

Variables: V Fields
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
LI : lookup Fields "head" V
H1 : is_list (is_pair is_string is_value) Fields
============================
 is_value V
 < apply lookup_is_value to _ LI.

Subgoal 1:

Variables: V Fields
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
LI : lookup Fields "head" V
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value V
============================
 is_value V
 < search.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
Is : is_value (recVal Fields)
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
============================
 is_value V
 < case Is.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_list (is_pair is_string is_value) Fields
============================
 is_value V
 < apply lookup_is_value to _ LI1.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Tl
============================
 is_value V
 < apply IH to _ LI2.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Tl
H3 : is_value V
============================
 is_value V
 < search.

Proof completed.
 < Theorem listLength_is :
     forall L I, is_value L -> listLength L I -> is_integer I.

============================
 forall L I, is_value L -> listLength L I -> is_integer I
 < induction on 2.

IH : forall L I, is_value L -> listLength L I * -> is_integer I
============================
 forall L I, is_value L -> listLength L I @ -> is_integer I
 < intros Is LL.

Variables: L I
IH : forall L I, is_value L -> listLength L I * -> is_integer I
Is : is_value L
LL : listLength L I @
============================
 is_integer I
 < LL: case LL.

Subgoal 1:

Variables: Fields
IH : forall L I, is_value L -> listLength L I * -> is_integer I
Is : is_value (recVal Fields)
LL : lookup Fields "null" trueVal
============================
 is_integer 0
 < search.

Subgoal 2:

Variables: I Tl I1 Fields
IH : forall L I, is_value L -> listLength L I * -> is_integer I
Is : is_value (recVal Fields)
LL : lookup Fields "null" falseVal
LL1 : lookup Fields "tail" Tl
LL2 : listLength Tl I1 *
LL3 : I1 + 1 = I
============================
 is_integer I
 < case Is.

Subgoal 2:

Variables: I Tl I1 Fields
IH : forall L I, is_value L -> listLength L I * -> is_integer I
LL : lookup Fields "null" falseVal
LL1 : lookup Fields "tail" Tl
LL2 : listLength Tl I1 *
LL3 : I1 + 1 = I
H1 : is_list (is_pair is_string is_value) Fields
============================
 is_integer I
 < apply lookup_is_value to _ LL1.

Subgoal 2:

Variables: I Tl I1 Fields
IH : forall L I, is_value L -> listLength L I * -> is_integer I
LL : lookup Fields "null" falseVal
LL1 : lookup Fields "tail" Tl
LL2 : listLength Tl I1 *
LL3 : I1 + 1 = I
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Tl
============================
 is_integer I
 < apply IH to _ LL2.

Subgoal 2:

Variables: I Tl I1 Fields
IH : forall L I, is_value L -> listLength L I * -> is_integer I
LL : lookup Fields "null" falseVal
LL1 : lookup Fields "tail" Tl
LL2 : listLength Tl I1 *
LL3 : I1 + 1 = I
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Tl
H3 : is_integer I1
============================
 is_integer I
 < apply plus_integer_is_integer to _ _ LL3.

Subgoal 2:

Variables: I Tl I1 Fields
IH : forall L I, is_value L -> listLength L I * -> is_integer I
LL : lookup Fields "null" falseVal
LL1 : lookup Fields "tail" Tl
LL2 : listLength Tl I1 *
LL3 : I1 + 1 = I
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Tl
H3 : is_integer I1
H4 : is_integer I
============================
 is_integer I
 < search.

Proof completed.
 < Theorem updateListIndex_is :
     forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out -> is_value Out.

============================
 forall L I V Out,
   is_value L -> is_value V -> updateListIndex L I V Out -> is_value Out
 < induction on 3.

IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
============================
 forall L I V Out,
   is_value L -> is_value V -> updateListIndex L I V Out @ -> is_value Out
 < intros IsL IsV ULI.

Variables: L I V Out
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsL : is_value L
IsV : is_value V
ULI : updateListIndex L I V Out @
============================
 is_value Out
 < ULI: case ULI.

Subgoal 1:

Variables: V NewFields Fields
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsL : is_value (recVal Fields)
IsV : is_value V
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
============================
 is_value (recVal NewFields)
 < case IsL.

Subgoal 1:

Variables: V NewFields Fields
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsV : is_value V
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
H1 : is_list (is_pair is_string is_value) Fields
============================
 is_value (recVal NewFields)
 < apply replaceRecVal_is to _ _ ULI1.

Subgoal 1:

Variables: V NewFields Fields
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsV : is_value V
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_list (is_pair is_string is_value) NewFields
============================
 is_value (recVal NewFields)
 < search.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsL : is_value (recVal Fields)
IsV : is_value V
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
============================
 is_value (recVal NewFields)
 < case IsL.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsV : is_value V
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
H1 : is_list (is_pair is_string is_value) Fields
============================
 is_value (recVal NewFields)
 < apply lookup_is_value to _ ULI2.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsV : is_value V
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Tl
============================
 is_value (recVal NewFields)
 < apply IH to _ _ ULI3.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsV : is_value V
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Tl
H3 : is_value TlNew
============================
 is_value (recVal NewFields)
 < apply replaceRecVal_is to _ _ ULI4.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out,
       is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out
IsV : is_value V
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Tl
H3 : is_value TlNew
H4 : is_list (is_pair is_string is_value) NewFields
============================
 is_value (recVal NewFields)
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_isCtx,
         exactEval:host:evalExpr_isValue,
         exactEval:host:evalStmt_isCtx,
         exactEval:host:evalArgs_isCtx,
         exactEval:host:evalArgs_isValue,
         exactEval:host:evalRecFields_isCtx,
         exactEval:host:evalRecFields_isValue
   with
      iterateList_isCtx : forall FE EE V X Body EE' O,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsEE : is_list (is_list (is_pair is_string is_value)) EE ->
         IL : iterateList FE EE V X Body EE' O ->
         is_list (is_list (is_pair is_string is_value)) EE'
      on IL as IH_IL.

Subgoal 1.27:

Variables: FE EE' Ty
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < Is: case IsE.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
Is : is_expr E1
Is1 : is_expr E2
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
Is : is_expr E1
Is1 : is_expr E2
H1 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev2.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
Is : is_expr E1
Is1 : is_expr E2
H1 : is_list (is_list (is_pair is_string is_value)) EE3
H2 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 1.29:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < Is: case IsE.

Subgoal 1.29:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
Is : is_expr E1
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 1.29:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
Is : is_expr E1
H1 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 1.30:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < Is: case IsE.

Subgoal 1.30:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
Is : is_expr E1
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 1.30:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
Is : is_expr E1
H1 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 1.31:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < Is: case IsE.

Subgoal 1.31:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
Is : is_expr E1
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 1.31:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
Is : is_expr E1
H1 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < Is: case IsE.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
Is : is_expr L
Is1 : is_expr I
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
Is : is_expr L
Is1 : is_expr I
H1 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev2.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
Is : is_expr L
Is1 : is_expr I
H1 : is_list (is_list (is_pair is_string is_value)) EE3
H2 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < Is: case IsE.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
Is : is_expr E1
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
Is : is_expr E1
H1 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 2.27:

Variables: FE EE' Ty
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @
============================
 is_value (recVal [("null", trueVal)])
 < case IsE.

Subgoal 2.27:

Variables: FE EE' Ty
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @
H1 : is_typ Ty
============================
 is_value (recVal [("null", trueVal)])
 < search 10.

Subgoal 2.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
 < case IsE.

Subgoal 2.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
 < apply IH_V_E to _ _ _ Ev1.

Subgoal 2.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_value V1
============================
 is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 2.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_value V1
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
 < apply IH_V_E to _ _ _ Ev2.

Subgoal 2.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_value V1
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value V2
============================
 is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
 < search 20.

Subgoal 2.29:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
============================
 is_value V
 < case IsE.

Subgoal 2.29:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
============================
 is_value V
 < Is: apply IH_V_E to _ _ _ Ev1.

Subgoal 2.29:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
Is : is_value (recVal Fields)
============================
 is_value V
 < case Is.

Subgoal 2.29:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
H2 : is_list (is_pair is_string is_value) Fields
============================
 is_value V
 < apply lookup_is_value to _ Ev2.

Subgoal 2.29:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
H2 : is_list (is_pair is_string is_value) Fields
H3 : is_value V
============================
 is_value V
 < search.

Subgoal 2.30:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
============================
 is_value V
 < case IsE.

Subgoal 2.30:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 is_value V
 < Is: apply IH_V_E to _ _ _ Ev1.

Subgoal 2.30:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
Is : is_value (recVal Fields)
============================
 is_value V
 < case Is.

Subgoal 2.30:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
H2 : is_list (is_pair is_string is_value) Fields
============================
 is_value V
 < apply lookup_is_value to _ Ev2.

Subgoal 2.30:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
H2 : is_list (is_pair is_string is_value) Fields
H3 : is_value V
============================
 is_value V
 < search.

Subgoal 2.31:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
============================
 is_value V
 < case IsE.

Subgoal 2.31:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
============================
 is_value V
 < Is: apply IH_V_E to _ _ _ Ev1.

Subgoal 2.31:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
Is : is_value (recVal Fields)
============================
 is_value V
 < case Is.

Subgoal 2.31:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
H2 : is_list (is_pair is_string is_value) Fields
============================
 is_value V
 < apply lookup_is_value to _ Ev2.

Subgoal 2.31:

Variables: FE EE EE' V O Fields E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
H2 : is_list (is_pair is_string is_value) Fields
H3 : is_value V
============================
 is_value V
 < search.

Subgoal 2.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 is_value V
 < case IsE.

Subgoal 2.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 is_value V
 < apply IH_V_E to _ _ _ Ev1.

Subgoal 2.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_value LV
============================
 is_value V
 < apply listIndex_is to _ Ev3.

Subgoal 2.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_value LV
H4 : is_value V
============================
 is_value V
 < search.

Subgoal 2.33:

Variables: FE EE EE' O V1 I E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
============================
 is_value (intVal I)
 < case IsE.

Subgoal 2.33:

Variables: FE EE EE' O V1 I E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
============================
 is_value (intVal I)
 < apply IH_V_E to _ _ _ Ev1.

Subgoal 2.33:

Variables: FE EE EE' O V1 I E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
H2 : is_value V1
============================
 is_value (intVal I)
 < apply listLength_is to _ Ev2.

Subgoal 2.33:

Variables: FE EE EE' O V1 I E1
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
H2 : is_value V1
H3 : is_integer I
============================
 is_value (intVal I)
 < search.

Subgoal 3.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < case IsS.

Subgoal 3.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 3.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev2.

Subgoal 3.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_V_E to _ _ _ Ev2.

Subgoal 3.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE4
H6 : is_value V
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply lookupScopes_is to _ Ev3.

Subgoal 3.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE4
H6 : is_value V
H7 : is_value LV
H8 : is_string L
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply updateListIndex_is to _ _ Ev4.

Subgoal 3.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE4
H6 : is_value V
H7 : is_value LV
H8 : is_string L
H9 : is_value LV2
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply replaceScopes_is to _ _ Ev5.

Subgoal 3.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE4
H6 : is_value V
H7 : is_value LV
H8 : is_string L
H9 : is_value LV2
H10 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 3.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < case IsS.

Subgoal 3.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 3.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_V_E to _ _ _ Ev1.

Subgoal 3.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_IL to _ _ _ _ _ Ev2.

Subgoal 3.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 8.1:

Variables: FE X Body EE' Fields
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IL : iterateList FE EE' (recVal Fields) X Body EE' [] @
IL1 : lookup Fields "null" trueVal
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 8.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < case IsV.

Subgoal 8.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply lookup_is_value to _ IL2.

Subgoal 8.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < IsEE3+: apply IH_C_S to _ _ _ IL3.

Subgoal 8.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < case IsEE3+.

Subgoal 8.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply lookup_is_value to _ IL4.

Subgoal 8.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value Tl
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_IL to _ _ _ _ _ IL5.

Subgoal 8.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list (is_list (is_pair is_string is_value)) EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value Tl
H6 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_isOutput,
         exactEval:host:evalStmt_isOutput,
         exactEval:host:evalArgs_isOutput,
         exactEval:host:evalRecFields_isOutput
   with
      iterateList_isOutput : forall FE EE V X Body EE' O,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsEE : is_list (is_list (is_pair is_string is_value)) EE ->
         IL : iterateList FE EE V X Body EE' O ->
         is_list is_value O
      on IL as IH_IL.

Subgoal 1.27:

Variables: FE EE' Ty
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @
============================
 is_list is_value []
 < search.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsE.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
============================
 is_list is_value O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev2.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_list is_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ Ev3.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_list is_value O3
H6 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.29:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
============================
 is_list is_value O
 < case IsE.

Subgoal 1.29:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.29:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
H2 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.30:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
============================
 is_list is_value O
 < case IsE.

Subgoal 1.30:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.30:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
H2 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.31:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
============================
 is_list is_value O
 < case IsE.

Subgoal 1.31:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.31:

Variables: FE EE EE' V O Fields E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
H2 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsE.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_list is_value O2
============================
 is_list is_value O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_list is_value O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev2.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_list is_value O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_list is_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ Ev4.

Subgoal 1.32:

Variables: FE EE EE' V O LV EE3 O2 Idx O3 I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_list is_value O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_list is_value O3
H6 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
============================
 is_list is_value O
 < case IsE.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
H2 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_value O2
============================
 is_list is_value O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_value O2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev2.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_value O2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
H6 : is_list is_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ Ev6.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_list is_value O2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
H6 : is_list is_value O3
H7 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsS.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list is_value O2
============================
 is_list is_value O
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list is_value O2
H5 : is_value LV
============================
 is_list is_value O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list is_value O2
H5 : is_value LV
H6 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list is_value O
 < apply IH_IL to _ _ _ _ _ Ev2.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list is_value O2
H5 : is_value LV
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : is_list is_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ Ev3.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_list is_value O2
H5 : is_value LV
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : is_list is_value O3
H8 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 5.1:

Variables: FE X Body EE' Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IL : iterateList FE EE' (recVal Fields) X Body EE' [] @
IL1 : lookup Fields "null" trueVal
============================
 is_list is_value []
 < search.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsV.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 is_list is_value O
 < apply lookup_is_value to _ IL2.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 is_list is_value O
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL3.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 is_list is_value O
 < case IsEE3+.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list is_value O
 < apply IH_S to _ _ _ IL3.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_list is_value O2
============================
 is_list is_value O
 < apply lookup_is_value to _ IL4.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_list is_value O2
H6 : is_value Tl
============================
 is_list is_value O
 < apply IH_IL to _ _ _ _ _ IL5.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_list is_value O2
H6 : is_value Tl
H7 : is_list is_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ IL6.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          is_list is_value O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_list is_value O2
H6 : is_value Tl
H7 : is_list is_value O3
H8 : is_list is_value O
============================
 is_list is_value O
 < search.

Proof completed.
 < Prove exactEval:host:paramName_is.

Proof completed.
 < Prove exactEval:host:getFunEvalInfo_is.

Proof completed.
 < Prove exactEval:host:evalProgram_isOutput.

Proof completed.
 < Prove exactEval:host:evalExpr_names_same,
         exactEval:host:evalStmt_names_same,
         exactEval:host:evalArgs_names_same,
         exactEval:host:evalRecFields_names_same
   with
      iterateList_names_same : forall FE EE V X Body EE' O,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsEE : is_list (is_list (is_pair is_string is_value)) EE ->
         IL : iterateList FE EE V X Body EE' O ->
         names_same EE EE'
      on IL as IH_IL.

Subgoal 1.27:

Variables: FE EE' Ty
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @
============================
 names_same EE' EE'
 < backchain names_same_reflexive.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 names_same EE EE'
 < case IsE.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 names_same EE EE'
 < NS1: apply IH_E to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
NS1 : names_same EE EE3
============================
 names_same EE EE'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
NS1 : names_same EE EE3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 names_same EE EE'
 < NS2: apply IH_E to _ _ _ Ev2.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
NS1 : names_same EE EE3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
NS2 : names_same EE3 EE'
============================
 names_same EE EE'
 < apply names_same_transitive to NS1 NS2.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
NS1 : names_same EE EE3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
NS2 : names_same EE3 EE'
H4 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Subgoal 1.29:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
============================
 names_same EE EE'
 < case IsE.

Subgoal 1.29:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
============================
 names_same EE EE'
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.29:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
H2 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Subgoal 1.30:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
============================
 names_same EE EE'
 < case IsE.

Subgoal 1.30:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 names_same EE EE'
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.30:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
H2 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Subgoal 1.31:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
============================
 names_same EE EE'
 < case IsE.

Subgoal 1.31:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
============================
 names_same EE EE'
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.31:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
H2 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 names_same EE EE'
 < case IsE.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 names_same EE EE'
 < NS1: apply IH_E to _ _ _ Ev1.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
NS1 : names_same EE EE3
============================
 names_same EE EE'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
NS1 : names_same EE EE3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 names_same EE EE'
 < NS2: apply IH_E to _ _ _ Ev2.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
NS1 : names_same EE EE3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
NS2 : names_same EE3 EE'
============================
 names_same EE EE'
 < apply names_same_transitive to NS1 NS2.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
NS1 : names_same EE EE3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
NS2 : names_same EE3 EE'
H4 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
============================
 names_same EE EE'
 < case IsE.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
============================
 names_same EE EE'
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
H2 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case IsS.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS_I: apply IH_E to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS_I : names_same (Scope::EE) EE2
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS_I : names_same (Scope::EE) EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS_E: apply IH_E to _ _ _ Ev2.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS_I : names_same (Scope::EE) EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE2
NS_E : names_same EE2 EE4
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < apply evalExpr_isCtx to _ _ _ Ev2.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS_I : names_same (Scope::EE) EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE2
NS_E : names_same EE2 EE4
H5 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS_R: apply replaceScopes_names_same to _ Ev5.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS_I : names_same (Scope::EE) EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE2
NS_E : names_same EE2 EE4
H5 : is_list (is_list (is_pair is_string is_value)) EE4
NS_R : names_same EE4 EE'
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS': apply names_same_transitive to NS_I NS_E.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS_I : names_same (Scope::EE) EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE2
NS_E : names_same EE2 EE4
H5 : is_list (is_list (is_pair is_string is_value)) EE4
NS_R : names_same EE4 EE'
NS' : names_same (Scope::EE) EE4
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS: apply names_same_transitive to NS' NS_R.

Subgoal 2.15:

Variables: FE Scope EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) EE' O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS_I : names_same (Scope::EE) EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE2
NS_E : names_same EE2 EE4
H5 : is_list (is_list (is_pair is_string is_value)) EE4
NS_R : names_same EE4 EE'
NS' : names_same (Scope::EE) EE4
NS : names_same (Scope::EE) EE'
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case NS.

Subgoal 2.15:

Variables: FE Scope EE O N EE2 O2 V EE4 O3 LV LV2 E I L BRest B
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listUpdate L I E) (B::BRest) O @
Ev1 : evalExpr FE (Scope::EE) I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 (B::BRest)
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS_I : names_same (Scope::EE) EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE2
NS_E : names_same EE2 EE4
H5 : is_list (is_list (is_pair is_string is_value)) EE4
NS_R : names_same EE4 (B::BRest)
NS' : names_same (Scope::EE) EE4
H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H8 : names_same EE BRest
============================
 exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
 < search.

Subgoal 2.16:

Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @
Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case IsS.

Subgoal 2.16:

Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @
Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS1: apply IH_E to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @
Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
NS1 : names_same (Scope::EE) EE3
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @
Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
NS1 : names_same (Scope::EE) EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @
Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
NS1 : names_same (Scope::EE) EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS2: apply IH_IL to _ _ _ _ _ Ev2.

Subgoal 2.16:

Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @
Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
NS1 : names_same (Scope::EE) EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
NS2 : names_same EE3 EE'
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS: apply names_same_transitive to NS1 NS2.

Subgoal 2.16:

Variables: FE Scope EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listForeach X L Body) EE' O @
Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
NS1 : names_same (Scope::EE) EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
NS2 : names_same EE3 EE'
NS : names_same (Scope::EE) EE'
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case NS.

Subgoal 2.16:

Variables: FE Scope EE O LV EE3 O2 O3 Body L X BRest B
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (listForeach X L Body) (B::BRest) O @
Ev1 : evalExpr FE (Scope::EE) L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body (B::BRest) O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
NS1 : names_same (Scope::EE) EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
NS2 : names_same EE3 (B::BRest)
H6 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H7 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H8 : names_same EE BRest
============================
 exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
 < search.

Subgoal 5.1:

Variables: FE X Body EE' Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IL : iterateList FE EE' (recVal Fields) X Body EE' [] @
IL1 : lookup Fields "null" trueVal
============================
 names_same EE' EE'
 < backchain names_same_reflexive.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
============================
 names_same EE EE'
 < case IsV.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 names_same EE EE'
 < apply lookup_is_value to _ IL2.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 names_same EE EE'
 < NS1: apply IH_S to _ _ _ IL3.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE''
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE'' Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
NS1 : names_same EE EE''
============================
 names_same EE EE'
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL3.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE''
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE'' Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
NS1 : names_same EE EE''
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
============================
 names_same EE EE'
 < case IsEE3+.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE''
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE'' Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
NS1 : names_same EE EE''
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) EE''
============================
 names_same EE EE'
 < apply lookup_is_value to _ IL4.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE''
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE'' Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
NS1 : names_same EE EE''
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) EE''
H5 : is_value Tl
============================
 names_same EE EE'
 < NS2: apply IH_IL to _ _ _ _ _ IL5.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE''
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE'' Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
NS1 : names_same EE EE''
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) EE''
H5 : is_value Tl
NS2 : names_same EE'' EE'
============================
 names_same EE EE'
 < apply names_same_transitive to NS1 NS2.

Subgoal 5.2:

Variables: FE EE X Body EE' O Hd O2 Tl O3 Fields Scope' EE''
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IH_IL : forall FE EE V X Body EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          names_same EE EE'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE'' Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
NS1 : names_same EE EE''
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) EE''
H5 : is_value Tl
NS2 : names_same EE'' EE'
H6 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Proof completed.
 < Theorem listIndex_geq_0 :
     forall L I V, is_integer I -> listIndex L I V -> I >= 0.

============================
 forall L I V, is_integer I -> listIndex L I V -> I >= 0
 < induction on 2.

IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0
============================
 forall L I V, is_integer I -> listIndex L I V @ -> I >= 0
 < intros IsI LI.

Variables: L I V
IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0
IsI : is_integer I
LI : listIndex L I V @
============================
 I >= 0
 < LI: case LI.

Subgoal 1:

Variables: V Fields
IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0
IsI : is_integer 0
LI : lookup Fields "head" V
============================
 0 >= 0
 < search.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
============================
 I >= 0
 < apply minus_integer_is_integer to _ _ LI.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
============================
 I >= 0
 < G: apply IH to _ LI2.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
G : I1 >= 0
============================
 I >= 0
 < P: apply minus_plus_same_integer to _ _ LI.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
G : I1 >= 0
P : I1 + 1 = I
============================
 I >= 0
 < apply greatereq_integer__add_positive to _ _ P.

Subgoal 2:

Variables: I V I1 Tl Fields
IH : forall L I V, is_integer I -> listIndex L I V * -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
G : I1 >= 0
P : I1 + 1 = I
H2 : I >= 0
============================
 I >= 0
 < search.

Proof completed.
 < Theorem listIndex_unique :
     forall L I VA VB, listIndex L I VA -> listIndex L I VB -> VA = VB.

============================
 forall L I VA VB, listIndex L I VA -> listIndex L I VB -> VA = VB
 < induction on 1.

IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
============================
 forall L I VA VB, listIndex L I VA @ -> listIndex L I VB -> VA = VB
 < intros LIA LIB.

Variables: L I VA VB
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : listIndex L I VA @
LIB : listIndex L I VB
============================
 VA = VB
 < LIA: case LIA.

Subgoal 1:

Variables: VA VB Fields
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIB : listIndex (recVal Fields) 0 VB
LIA : lookup Fields "head" VA
============================
 VA = VB
 < LIB: case LIB.

Subgoal 1.1:

Variables: VA VB Fields
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : lookup Fields "head" VA
LIB : lookup Fields "head" VB
============================
 VA = VB
 < apply lookup_unique to LIA LIB.

Subgoal 1.1:

Variables: VB Fields
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : lookup Fields "head" VB
LIB : lookup Fields "head" VB
============================
 VB = VB
 < search.

Subgoal 1.2:

Variables: VA VB Fields I1 Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : lookup Fields "head" VA
LIB : 0 - 1 = I1
LIB1 : lookup Fields "tail" Tl
LIB2 : listIndex Tl I1 VB
============================
 VA = VB
 < compute LIB.

Subgoal 1.2:

Variables: VA VB Fields Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : lookup Fields "head" VA
LIB : 0 - 1 = -1
LIB1 : lookup Fields "tail" Tl
LIB2 : listIndex Tl -1 VB
============================
 VA = VB
 < G: apply listIndex_geq_0 to _ LIB2.

Subgoal 1.2:

Variables: VA VB Fields Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : lookup Fields "head" VA
LIB : 0 - 1 = -1
LIB1 : lookup Fields "tail" Tl
LIB2 : listIndex Tl -1 VB
G : -1 >= 0
============================
 VA = VB
 < G: case G.

Subgoal 1.2:

Variables: VA VB Fields Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : lookup Fields "head" VA
LIB : 0 - 1 = -1
LIB1 : lookup Fields "tail" Tl
LIB2 : listIndex Tl -1 VB
G : 0 <= -1
============================
 VA = VB
 < case G.

Subgoal 2:

Variables: I VA VB I1 Tl Fields
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIB : listIndex (recVal Fields) I VB
LIA : I - 1 = I1
LIA1 : lookup Fields "tail" Tl
LIA2 : listIndex Tl I1 VA *
============================
 VA = VB
 < LIB: case LIB.

Subgoal 2.1:

Variables: VA VB I1 Tl Fields
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : 0 - 1 = I1
LIA1 : lookup Fields "tail" Tl
LIA2 : listIndex Tl I1 VA *
LIB : lookup Fields "head" VB
============================
 VA = VB
 < compute LIA.

Subgoal 2.1:

Variables: VA VB Tl Fields
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : 0 - 1 = -1
LIA1 : lookup Fields "tail" Tl
LIA2 : listIndex Tl -1 VA *
LIB : lookup Fields "head" VB
============================
 VA = VB
 < G: apply listIndex_geq_0 to _ LIA2.

Subgoal 2.1:

Variables: VA VB Tl Fields
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : 0 - 1 = -1
LIA1 : lookup Fields "tail" Tl
LIA2 : listIndex Tl -1 VA *
LIB : lookup Fields "head" VB
G : -1 >= 0
============================
 VA = VB
 < G: case G.

Subgoal 2.1:

Variables: VA VB Tl Fields
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : 0 - 1 = -1
LIA1 : lookup Fields "tail" Tl
LIA2 : listIndex Tl -1 VA *
LIB : lookup Fields "head" VB
G : 0 <= -1
============================
 VA = VB
 < case G.

Subgoal 2.2:

Variables: I VA VB I1 Tl Fields I2 Tl1
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : I - 1 = I1
LIA1 : lookup Fields "tail" Tl
LIA2 : listIndex Tl I1 VA *
LIB : I - 1 = I2
LIB1 : lookup Fields "tail" Tl1
LIB2 : listIndex Tl1 I2 VB
============================
 VA = VB
 < apply minus_integer_unique to LIA LIB.

Subgoal 2.2:

Variables: I VA VB Tl Fields I2 Tl1
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : I - 1 = I2
LIA1 : lookup Fields "tail" Tl
LIA2 : listIndex Tl I2 VA *
LIB : I - 1 = I2
LIB1 : lookup Fields "tail" Tl1
LIB2 : listIndex Tl1 I2 VB
============================
 VA = VB
 < apply lookup_unique to LIA1 LIB1.

Subgoal 2.2:

Variables: I VA VB Fields I2 Tl1
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : I - 1 = I2
LIA1 : lookup Fields "tail" Tl1
LIA2 : listIndex Tl1 I2 VA *
LIB : I - 1 = I2
LIB1 : lookup Fields "tail" Tl1
LIB2 : listIndex Tl1 I2 VB
============================
 VA = VB
 < apply IH to LIA2 LIB2.

Subgoal 2.2:

Variables: I VB Fields I2 Tl1
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : I - 1 = I2
LIA1 : lookup Fields "tail" Tl1
LIA2 : listIndex Tl1 I2 VB *
LIB : I - 1 = I2
LIB1 : lookup Fields "tail" Tl1
LIB2 : listIndex Tl1 I2 VB
============================
 VB = VB
 < search.

Proof completed.
 < Theorem listLength_unique :
     forall L IA IB, listLength L IA -> listLength L IB -> IA = IB.

============================
 forall L IA IB, listLength L IA -> listLength L IB -> IA = IB
 < induction on 1.

IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
============================
 forall L IA IB, listLength L IA @ -> listLength L IB -> IA = IB
 < intros LLA LLB.

Variables: L IA IB
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : listLength L IA @
LLB : listLength L IB
============================
 IA = IB
 < LLA: case LLA.

Subgoal 1:

Variables: IB Fields
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLB : listLength (recVal Fields) IB
LLA : lookup Fields "null" trueVal
============================
 0 = IB
 < LLB: case LLB.

Subgoal 1.1:

Variables: Fields
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : lookup Fields "null" trueVal
LLB : lookup Fields "null" trueVal
============================
 0 = 0
 < search.

Subgoal 1.2:

Variables: IB Fields Tl I
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : lookup Fields "null" trueVal
LLB : lookup Fields "null" falseVal
LLB1 : lookup Fields "tail" Tl
LLB2 : listLength Tl I
LLB3 : I + 1 = IB
============================
 0 = IB
 < apply lookup_unique to LLA LLB.

Subgoal 2:

Variables: IA IB Tl I Fields
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLB : listLength (recVal Fields) IB
LLA : lookup Fields "null" falseVal
LLA1 : lookup Fields "tail" Tl
LLA2 : listLength Tl I *
LLA3 : I + 1 = IA
============================
 IA = IB
 < LLB: case LLB.

Subgoal 2.1:

Variables: IA Tl I Fields
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : lookup Fields "null" falseVal
LLA1 : lookup Fields "tail" Tl
LLA2 : listLength Tl I *
LLA3 : I + 1 = IA
LLB : lookup Fields "null" trueVal
============================
 IA = 0
 < apply lookup_unique to LLA LLB.

Subgoal 2.2:

Variables: IA IB Tl I Fields Tl1 I1
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : lookup Fields "null" falseVal
LLA1 : lookup Fields "tail" Tl
LLA2 : listLength Tl I *
LLA3 : I + 1 = IA
LLB : lookup Fields "null" falseVal
LLB1 : lookup Fields "tail" Tl1
LLB2 : listLength Tl1 I1
LLB3 : I1 + 1 = IB
============================
 IA = IB
 < apply lookup_unique to LLA1 LLB1.

Subgoal 2.2:

Variables: IA IB I Fields Tl1 I1
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : lookup Fields "null" falseVal
LLA1 : lookup Fields "tail" Tl1
LLA2 : listLength Tl1 I *
LLA3 : I + 1 = IA
LLB : lookup Fields "null" falseVal
LLB1 : lookup Fields "tail" Tl1
LLB2 : listLength Tl1 I1
LLB3 : I1 + 1 = IB
============================
 IA = IB
 < apply IH to LLA2 LLB2.

Subgoal 2.2:

Variables: IA IB Fields Tl1 I1
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : lookup Fields "null" falseVal
LLA1 : lookup Fields "tail" Tl1
LLA2 : listLength Tl1 I1 *
LLA3 : I1 + 1 = IA
LLB : lookup Fields "null" falseVal
LLB1 : lookup Fields "tail" Tl1
LLB2 : listLength Tl1 I1
LLB3 : I1 + 1 = IB
============================
 IA = IB
 < apply plus_integer_unique to LLA3 LLB3.

Subgoal 2.2:

Variables: IB Fields Tl1 I1
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : lookup Fields "null" falseVal
LLA1 : lookup Fields "tail" Tl1
LLA2 : listLength Tl1 I1 *
LLA3 : I1 + 1 = IB
LLB : lookup Fields "null" falseVal
LLB1 : lookup Fields "tail" Tl1
LLB2 : listLength Tl1 I1
LLB3 : I1 + 1 = IB
============================
 IB = IB
 < search.

Proof completed.
 < Theorem updateListIndex_geq_0 :
     forall L I V Out, is_integer I -> updateListIndex L I V Out -> I >= 0.

============================
 forall L I V Out, is_integer I -> updateListIndex L I V Out -> I >= 0
 < induction on 2.

IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
============================
 forall L I V Out, is_integer I -> updateListIndex L I V Out @ -> I >= 0
 < intros IsI ULI.

Variables: L I V Out
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : updateListIndex L I V Out @
============================
 I >= 0
 < ULI: case ULI.

Subgoal 1:

Variables: V NewFields Fields
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer 0
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
============================
 0 >= 0
 < search.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
============================
 I >= 0
 < apply minus_integer_is_integer to _ _ ULI1.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
H1 : is_integer I1
============================
 I >= 0
 < G: apply IH to _ ULI3.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
H1 : is_integer I1
G : I1 >= 0
============================
 I >= 0
 < P: apply minus_plus_same_integer to _ _ ULI1.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
H1 : is_integer I1
G : I1 >= 0
P : I1 + 1 = I
============================
 I >= 0
 < apply greatereq_integer__add_positive to _ _ P.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
H1 : is_integer I1
G : I1 >= 0
P : I1 + 1 = I
H2 : I >= 0
============================
 I >= 0
 < search.

Proof completed.
 < Theorem updateListIndex_unique :
     forall L I V OutA OutB,
       updateListIndex L I V OutA -> updateListIndex L I V OutB -> OutA = OutB.

============================
 forall L I V OutA OutB,
   updateListIndex L I V OutA -> updateListIndex L I V OutB -> OutA = OutB
 < induction on 1.

IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
============================
 forall L I V OutA OutB,
   updateListIndex L I V OutA @ -> updateListIndex L I V OutB -> OutA = OutB
 < intros ULIA ULIB.

Variables: L I V OutA OutB
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : updateListIndex L I V OutA @
ULIB : updateListIndex L I V OutB
============================
 OutA = OutB
 < ULIA: case ULIA.

Subgoal 1:

Variables: V OutB NewFields Fields
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIB : updateListIndex (recVal Fields) 0 V OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : replaceRecVal "head" V Fields NewFields
============================
 recVal NewFields = OutB
 < ULIB: case ULIB.

Subgoal 1.1:

Variables: V NewFields Fields NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : replaceRecVal "head" V Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : replaceRecVal "head" V Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < apply replaceRecVal_unique to ULIA1 ULIB1.

Subgoal 1.1:

Variables: V Fields NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : replaceRecVal "head" V Fields NewFields1
ULIB : lookup Fields "null" falseVal
ULIB1 : replaceRecVal "head" V Fields NewFields1
============================
 recVal NewFields1 = recVal NewFields1
 < search.

Subgoal 1.2:

Variables: V NewFields Fields I1 Tl TlNew NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : replaceRecVal "head" V Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : 0 - 1 = I1
ULIB2 : lookup Fields "tail" Tl
ULIB3 : updateListIndex Tl I1 V TlNew
ULIB4 : replaceRecVal "tail" TlNew Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < compute ULIB1.

Subgoal 1.2:

Variables: V NewFields Fields Tl TlNew NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : replaceRecVal "head" V Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : 0 - 1 = -1
ULIB2 : lookup Fields "tail" Tl
ULIB3 : updateListIndex Tl -1 V TlNew
ULIB4 : replaceRecVal "tail" TlNew Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < G: apply updateListIndex_geq_0 to _ ULIB3.

Subgoal 1.2:

Variables: V NewFields Fields Tl TlNew NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : replaceRecVal "head" V Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : 0 - 1 = -1
ULIB2 : lookup Fields "tail" Tl
ULIB3 : updateListIndex Tl -1 V TlNew
ULIB4 : replaceRecVal "tail" TlNew Fields NewFields1
G : -1 >= 0
============================
 recVal NewFields = recVal NewFields1
 < G: case G.

Subgoal 1.2:

Variables: V NewFields Fields Tl TlNew NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : replaceRecVal "head" V Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : 0 - 1 = -1
ULIB2 : lookup Fields "tail" Tl
ULIB3 : updateListIndex Tl -1 V TlNew
ULIB4 : replaceRecVal "tail" TlNew Fields NewFields1
G : 0 <= -1
============================
 recVal NewFields = recVal NewFields1
 < case G.

Subgoal 2:

Variables: I V OutB I1 Tl TlNew NewFields Fields
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIB : updateListIndex (recVal Fields) I V OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : I - 1 = I1
ULIA2 : lookup Fields "tail" Tl
ULIA3 : updateListIndex Tl I1 V TlNew *
ULIA4 : replaceRecVal "tail" TlNew Fields NewFields
============================
 recVal NewFields = OutB
 < ULIB: case ULIB.

Subgoal 2.1:

Variables: V I1 Tl TlNew NewFields Fields NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : 0 - 1 = I1
ULIA2 : lookup Fields "tail" Tl
ULIA3 : updateListIndex Tl I1 V TlNew *
ULIA4 : replaceRecVal "tail" TlNew Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : replaceRecVal "head" V Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < compute ULIA1.

Subgoal 2.1:

Variables: V Tl TlNew NewFields Fields NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : 0 - 1 = -1
ULIA2 : lookup Fields "tail" Tl
ULIA3 : updateListIndex Tl -1 V TlNew *
ULIA4 : replaceRecVal "tail" TlNew Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : replaceRecVal "head" V Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < G: apply updateListIndex_geq_0 to _ ULIA3.

Subgoal 2.1:

Variables: V Tl TlNew NewFields Fields NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : 0 - 1 = -1
ULIA2 : lookup Fields "tail" Tl
ULIA3 : updateListIndex Tl -1 V TlNew *
ULIA4 : replaceRecVal "tail" TlNew Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : replaceRecVal "head" V Fields NewFields1
G : -1 >= 0
============================
 recVal NewFields = recVal NewFields1
 < G: case G.

Subgoal 2.1:

Variables: V Tl TlNew NewFields Fields NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : 0 - 1 = -1
ULIA2 : lookup Fields "tail" Tl
ULIA3 : updateListIndex Tl -1 V TlNew *
ULIA4 : replaceRecVal "tail" TlNew Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : replaceRecVal "head" V Fields NewFields1
G : 0 <= -1
============================
 recVal NewFields = recVal NewFields1
 < case G.

Subgoal 2.2:

Variables: I V I1 Tl TlNew NewFields Fields I2 Tl1 TlNew1 NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : I - 1 = I1
ULIA2 : lookup Fields "tail" Tl
ULIA3 : updateListIndex Tl I1 V TlNew *
ULIA4 : replaceRecVal "tail" TlNew Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : I - 1 = I2
ULIB2 : lookup Fields "tail" Tl1
ULIB3 : updateListIndex Tl1 I2 V TlNew1
ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < apply minus_integer_unique to ULIA1 ULIB1.

Subgoal 2.2:

Variables: I V Tl TlNew NewFields Fields I2 Tl1 TlNew1 NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : I - 1 = I2
ULIA2 : lookup Fields "tail" Tl
ULIA3 : updateListIndex Tl I2 V TlNew *
ULIA4 : replaceRecVal "tail" TlNew Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : I - 1 = I2
ULIB2 : lookup Fields "tail" Tl1
ULIB3 : updateListIndex Tl1 I2 V TlNew1
ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < apply lookup_unique to ULIA2 ULIB2.

Subgoal 2.2:

Variables: I V TlNew NewFields Fields I2 Tl1 TlNew1 NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : I - 1 = I2
ULIA2 : lookup Fields "tail" Tl1
ULIA3 : updateListIndex Tl1 I2 V TlNew *
ULIA4 : replaceRecVal "tail" TlNew Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : I - 1 = I2
ULIB2 : lookup Fields "tail" Tl1
ULIB3 : updateListIndex Tl1 I2 V TlNew1
ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < apply IH to ULIA3 ULIB3.

Subgoal 2.2:

Variables: I V NewFields Fields I2 Tl1 TlNew1 NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : I - 1 = I2
ULIA2 : lookup Fields "tail" Tl1
ULIA3 : updateListIndex Tl1 I2 V TlNew1 *
ULIA4 : replaceRecVal "tail" TlNew1 Fields NewFields
ULIB : lookup Fields "null" falseVal
ULIB1 : I - 1 = I2
ULIB2 : lookup Fields "tail" Tl1
ULIB3 : updateListIndex Tl1 I2 V TlNew1
ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1
============================
 recVal NewFields = recVal NewFields1
 < apply replaceRecVal_unique to ULIA4 ULIB4.

Subgoal 2.2:

Variables: I V Fields I2 Tl1 TlNew1 NewFields1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : lookup Fields "null" falseVal
ULIA1 : I - 1 = I2
ULIA2 : lookup Fields "tail" Tl1
ULIA3 : updateListIndex Tl1 I2 V TlNew1 *
ULIA4 : replaceRecVal "tail" TlNew1 Fields NewFields1
ULIB : lookup Fields "null" falseVal
ULIB1 : I - 1 = I2
ULIB2 : lookup Fields "tail" Tl1
ULIB3 : updateListIndex Tl1 I2 V TlNew1
ULIB4 : replaceRecVal "tail" TlNew1 Fields NewFields1
============================
 recVal NewFields1 = recVal NewFields1
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_newNameScopes,
         exactEval:host:evalExpr_newNameScopes_output,
         exactEval:host:evalExpr_newNameScopes_ctx,
         exactEval:host:evalStmt_newNameScopes_output,
         exactEval:host:evalStmt_newNameScopes,
         exactEval:host:evalArgs_newNameScopes,
         exactEval:host:evalArgs_newNameScopes_output,
         exactEval:host:evalArgs_newNameScopes_ctx,
         exactEval:host:evalRecFields_newNameScopes,
         exactEval:host:evalRecFields_newNameScopes_output,
         exactEval:host:evalRecFields_newNameScopes_ctx
   with
      iterateList_newNameScopes_output : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsA : is_list (is_list (is_pair is_string is_value)) EE_A ->
         IsB : is_list (is_list (is_pair is_string is_value)) EE_B ->
         ILA : iterateList FE EE_A V X Body EE_A' O_A ->
         ILB : iterateList FE EE_B V X Body EE_B' O_B ->
         NNS : newNameScopes N Len EE_A EE_B ->
         O_A = O_B
      on ILA as IH_O_IL,
      iterateList_newNameScopes : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsA : is_list (is_list (is_pair is_string is_value)) EE_A ->
         IsB : is_list (is_list (is_pair is_string is_value)) EE_B ->
         ILA : iterateList FE EE_A V X Body EE_A' O_A ->
         ILB : iterateList FE EE_B V X Body EE_B' O_B ->
         NNS : newNameScopes N Len EE_A EE_B ->
         newNameScopes N Len EE_A' EE_B'
      on ILA as IH_C_IL.

Subgoal 1.27:

Variables: FE EE_B VB EE_A' EE_B' O_B N Len Ty
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
EvB : evalExpr FE EE_B (nil Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A' EE_B
============================
 recVal [("null", trueVal)] = VB
 < case EvB.

Subgoal 1.27:

Variables: FE EE_A' EE_B' N Len Ty
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B'
============================
 recVal [("null", trueVal)] = recVal [("null", trueVal)]
 < search.

Subgoal 1.28:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = VB
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = VB
 < EvB: case EvB.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V3 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
 < apply IH_V_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V4)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V3 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V4 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 recVal [("null", falseVal), ("head", V3), ("tail", V4)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
 < search.

Subgoal 1.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
============================
 VA = VB
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
============================
 VA = VB
 < EvB: case EvB.

Subgoal 1.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "head" VB
============================
 VA = VB
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 1.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A *
EvA2 : lookup Fields1 "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "head" VB
============================
 VA = VB
 < apply lookup_unique to EvA2 EvB1.

Subgoal 1.29:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VB EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A *
EvA2 : lookup Fields1 "head" VB
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "head" VB
============================
 VB = VB
 < search.

Subgoal 1.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
============================
 VA = VB
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
============================
 VA = VB
 < EvB: case EvB.

Subgoal 1.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "tail" VB
============================
 VA = VB
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 1.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A *
EvA2 : lookup Fields1 "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "tail" VB
============================
 VA = VB
 < apply lookup_unique to EvA2 EvB1.

Subgoal 1.30:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VB EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A *
EvA2 : lookup Fields1 "tail" VB
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "tail" VB
============================
 VB = VB
 < search.

Subgoal 1.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
============================
 VA = VB
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
============================
 VA = VB
 < EvB: case EvB.

Subgoal 1.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "null" VB
============================
 VA = VB
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 1.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A *
EvA2 : lookup Fields1 "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "null" VB
============================
 VA = VB
 < apply lookup_unique to EvA2 EvB1.

Subgoal 1.31:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VB EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' O_A *
EvA2 : lookup Fields1 "null" VB
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "null" VB
============================
 VB = VB
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
============================
 VA = VB
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
============================
 VA = VB
 < EvB: case EvB.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 VA = VB
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
============================
 VA = VB
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 VA = VB
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 VA = VB
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV1 EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 VA = VB
 < apply IH_V_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV1 EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O2 *
EvA3 : listIndex LV1 Idx1 VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 VA = VB
 < apply listIndex_unique to EvA3 EvB2.

Subgoal 1.32:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VB EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV1 EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O2 *
EvA3 : listIndex LV1 Idx1 VB
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 VB = VB
 < search.

Subgoal 1.33:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
============================
 intVal I = VB
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
H1 : is_expr E1
============================
 intVal I = VB
 < EvB: case EvB.

Subgoal 1.33:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V I E1 V1 I1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' O_B
EvB1 : listLength V1 I1
============================
 intVal I = intVal I1
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 1.33:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len I E1 V1 I1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O_A *
EvA2 : listLength V1 I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' O_B
EvB1 : listLength V1 I1
============================
 intVal I = intVal I1
 < apply listLength_unique to EvA2 EvB1.

Subgoal 1.33:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len E1 V1 I1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I1) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O_A *
EvA2 : listLength V1 I1
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' O_B
EvB1 : listLength V1 I1
============================
 intVal I1 = intVal I1
 < search.

Subgoal 2.27:

Variables: FE EE_B VB EE_A' EE_B' O_B N Len Ty
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
EvB : evalExpr FE EE_B (nil Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A' EE_B
============================
 [] = O_B
 < case EvB.

Subgoal 2.27:

Variables: FE EE_A' EE_B' N Len Ty
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B'
============================
 [] = []
 < search.

Subgoal 2.28:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
============================
 O_A = O_B
 < case IsE.

Subgoal 2.28:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 2.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 2.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 2.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 2.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 2.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply append_unique to EvA3 EvB2.

Subgoal 2.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len EE1 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_B = O_B
 < search.

Subgoal 2.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
============================
 O_A = O_B
 < case IsE.

Subgoal 2.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "head" VB
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 2.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_B *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "head" VB
============================
 O_B = O_B
 < search.

Subgoal 2.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
============================
 O_A = O_B
 < case IsE.

Subgoal 2.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "tail" VB
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 2.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_B *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "tail" VB
============================
 O_B = O_B
 < search.

Subgoal 2.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
============================
 O_A = O_B
 < case IsE.

Subgoal 2.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "null" VB
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 2.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_B *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "null" VB
============================
 O_B = O_B
 < search.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
============================
 O_A = O_B
 < case IsE.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O3 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 Idx I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O4 *
EvA3 : listIndex LV Idx VA
EvA4 : O3 ++ O4 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply append_unique to EvA4 EvB3.

Subgoal 2.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len LV EE1 Idx I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O4 *
EvA3 : listIndex LV Idx VA
EvA4 : O3 ++ O4 = O_B
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_B = O_B
 < search.

Subgoal 2.33:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
============================
 O_A = O_B
 < case IsE.

Subgoal 2.33:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
H1 : is_expr E1
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.33:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V I E1 V1 I1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' O_B
EvB1 : listLength V1 I1
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 2.33:

Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len V I E1 V1 I1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_B *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' O_B
EvB1 : listLength V1 I1
============================
 O_B = O_B
 < search.

Subgoal 3.27:

Variables: FE EE_B VB EE_A' EE_B' O_B N Len Ty
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
EvB : evalExpr FE EE_B (nil Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A' EE_B
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsE.

Subgoal 3.27:

Variables: FE EE_B VB EE_A' EE_B' O_B N Len Ty
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
EvB : evalExpr FE EE_B (nil Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A' EE_B
H1 : is_typ Ty
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.27:

Variables: FE EE_A' EE_B' N Len Ty
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B'
H1 : is_typ Ty
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 3.28:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsE.

Subgoal 3.28:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 3.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 3.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 3.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 3.28:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
H6 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 3.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsE.

Subgoal 3.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (head E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "head" VB
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 3.29:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "head" VB
H2 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 3.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsE.

Subgoal 3.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "tail" VB
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 3.30:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "tail" VB
H2 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 3.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsE.

Subgoal 3.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
EvB : evalExpr FE EE_B (null E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "null" VB
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 3.31:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Fields E1 Fields1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O_A *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' O_B
EvB1 : lookup Fields1 "null" VB
H2 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 3.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsE.

Subgoal 3.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
EvB : evalExpr FE EE_B (index L I) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 3.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 3.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 3.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 3.32:

Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
H3 : newNameScopes N Len EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
H6 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 3.33:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsE.

Subgoal 3.33:

Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len V I E1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
H1 : is_expr E1
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.33:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V I E1 V1 I1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' O_B
EvB1 : listLength V1 I1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 3.33:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len V I E1 V1 I1
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O_A *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' O_B
EvB1 : listLength V1 I1
H2 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
============================
 O_A = O_B
 < case IsS.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 O_A = O_B
 < apply IH_C_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : newNameScopes N Len EE2 EE4
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvA2.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : newNameScopes N Len EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : newNameScopes N Len EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 O_A = O_B
 < L: apply newNameScopes_lookupScopes to _ _ _ EvB2 with
        A = EE2.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : newNameScopes N Len EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV1
============================
 O_A = O_B
 < apply lookupScopes_unique to L EvA3.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : newNameScopes N Len EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : newNameScopes N Len EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 V EE2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O4 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O4 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : newNameScopes N Len EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
============================
 O_A = O_B
 < apply append_unique to EvA6 EvB5.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope N1 EE1 V EE2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O4 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O4 = O_B
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : newNameScopes N Len EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
============================
 O_B = O_B
 < search.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
============================
 O_A = O_B
 < case IsS.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O3 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O3 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
============================
 O_A = O_B
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O3 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV
============================
 O_A = O_B
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
H5 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 O_A = O_B
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply IH_O_IL to _ _ _ _ _ _ EvA2 EvB1 _.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < apply append_unique to EvA3 EvB2.

Subgoal 4.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope EE1 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_B = O_B
 < search.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsS.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 newNameScopes N Len EE_A' EE_B'
 < NNS': apply IH_C_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA2.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 newNameScopes N Len EE_A' EE_B'
 < L: apply newNameScopes_lookupScopes to _ _ _ EvB2 with
        A = EE2.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV1 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookupScopes_unique to L EvA3.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope N1 EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 V EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_V_E to _ _ _ _ EvA2 EvB1 _.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV LV2 E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 *
EvA2 : evalExpr FE EE1 E V1 EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N2 V1 LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
============================
 newNameScopes N Len EE_A' EE_B'
 < apply updateListIndex_unique to EvA4 EvB3.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 *
EvA2 : evalExpr FE EE1 E V1 EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N2 V1 LV3
EvA5 : replaceScopes L LV3 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isValue to _ _ _ EvA2.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 *
EvA2 : evalExpr FE EE1 E V1 EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N2 V1 LV3
EvA5 : replaceScopes L LV3 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
H9 : is_value V1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookupScopes_is to _ EvA3.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 *
EvA2 : evalExpr FE EE1 E V1 EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N2 V1 LV3
EvA5 : replaceScopes L LV3 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
H9 : is_value V1
H10 : is_value LV
H11 : is_string L
============================
 newNameScopes N Len EE_A' EE_B'
 < apply updateListIndex_is to _ _ EvA4.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 *
EvA2 : evalExpr FE EE1 E V1 EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N2 V1 LV3
EvA5 : replaceScopes L LV3 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
H9 : is_value V1
H10 : is_value LV
H11 : is_string L
H12 : is_value LV3
============================
 newNameScopes N Len EE_A' EE_B'
 < R: apply newNameScopes_replaceScopes to _ _ _ _ NNS' EvB4.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3 RA
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 *
EvA2 : evalExpr FE EE1 E V1 EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N2 V1 LV3
EvA5 : replaceScopes L LV3 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
H9 : is_value V1
H10 : is_value LV
H11 : is_string L
H12 : is_value LV3
R : replaceScopes L LV3 EE2 RA
R1 : newNameScopes N Len RA EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < apply replaceScopes_unique to R EvA5.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 EE2 O2 LV E I L N2 EE3 O3 V1 EE4 O4 LV3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N2) EE1 O1 *
EvA2 : evalExpr FE EE1 E V1 EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N2 V1 LV3
EvA5 : replaceScopes L LV3 EE2 EE_A'
EvA6 : O1 ++ O2 = O_A
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE (Scope::EE_B) I (intVal N2) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV
EvB3 : updateListIndex LV N2 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = O_B
H4 : newNameScopes N Len EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
NNS' : newNameScopes N Len EE2 EE4
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : is_list (is_list (is_pair is_string is_value)) EE4
L : lookupScopes L EE2 LV
H9 : is_value V1
H10 : is_value LV
H11 : is_string L
H12 : is_value LV3
R : replaceScopes L LV3 EE2 EE_A'
R1 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsS.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < NNS': apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_V_E to _ _ _ _ EvA1 EvB _.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O1 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O1 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
H5 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O1 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < NNS'': apply IH_C_IL to _ _ _ _ _ _ EvA2 EvB1 _.

Subgoal 5.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV1 EE1 O1 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len EE1 EE2
H4 : is_value LV1
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
NNS'' : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 12.1:

Variables: FE EE_B X Body EE_A' EE_B' O_B N Len Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A' EE_B
ILA1 : lookup Fields "null" trueVal
============================
 [] = O_B
 < ILB: case ILB.

Subgoal 12.1.1:

Variables: FE X Body EE_A' EE_B' N Len Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B'
ILA1 : lookup Fields "null" trueVal
ILB : lookup Fields "null" trueVal
============================
 [] = []
 < search.

Subgoal 12.1.2:

Variables: FE EE_B X Body EE_A' EE_B' O_B N Len Fields Hd Scope EE1 O1 Tl O2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B
ILA1 : lookup Fields "null" trueVal
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O1
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE1 Tl X Body EE_B' O2
ILB5 : O1 ++ O2 = O_B
============================
 [] = O_B
 < apply lookup_unique to ILA1 ILB.

Subgoal 12.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
============================
 O_A = O_B
 < case IsV.

Subgoal 12.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
============================
 O_A = O_B
 < ILB: case ILB.

Subgoal 12.2.1:

Variables: FE EE_A X Body EE_A' EE_B' O_A N Len Hd Scope EE1 O1 Tl O2 Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B'
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" trueVal
============================
 O_A = []
 < apply lookup_unique to ILA1 ILB.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < apply lookup_is_value to _ ILA2.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd
============================
 O_A = O_B
 < apply lookup_unique to ILA2 ILB1.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
============================
 O_A = O_B
 < apply IH_O_S to _ _ _ _ ILA3 ILB2 _.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
============================
 O_A = O_B
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 O_A = O_B
 < case IsEE1+.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 O_A = O_B
 < IsEE2+: apply evalStmt_isCtx to _ _ _ ILB2.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2)
============================
 O_A = O_B
 < case IsEE2+.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 O_A = O_B
 < NNS': apply IH_C_S to _ _ _ _ ILA3 ILB2 _.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2)
============================
 O_A = O_B
 < apply lookup_unique to ILA4 ILB3.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2)
============================
 O_A = O_B
 < apply lookup_is_value to _ ILA4.

Subgoal 12.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2)
H7 : is_value Tl1
============================
 O_A = O_B
 < NNS': case NNS'.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 O_A = O_B
 < LenB: apply length_exists_list_pair_string_value to IsB.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
============================
 O_A = O_B
 < IsN2: apply length_is to LenB.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
============================
 O_A = O_B
 < P: apply plus_integer_total to _ IsN2 with
        N1 = 1.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
============================
 O_A = O_B
 < LenEE_B+: assert length ([(X, Hd1)]::EE_B) N3.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd1)]::EE_B) N3
============================
 O_A = O_B
 < LenEE2+: apply evalStmt_keep_scopes to _ _ _ ILB2 LenEE_B+.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd1)]::EE_B) N3
LenEE2+ : length (Scope1::EE2) N3
============================
 O_A = O_B
 < apply length_unique to LenEE2+ NNS'.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd1)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
============================
 O_A = O_B
 < LEq: apply newNameScopes_length to NNS LenB.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd1)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
LEq : Len <= N2
============================
 O_A = O_B
 < L: apply lt_plus_one to P _.

Subgoal 12.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd1)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
LEq : Len <= N2
L : N2 < Len
============================
 O_A = O_B
 < apply less_lesseq_flip_false to L LEq.

Subgoal 12.2.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O3 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope1
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : newNameScopes N Len EE1 EE2
============================
 O_A = O_B
 < apply IH_O_IL to _ _ _ _ _ _ ILA5 ILB4 NNS'.

Subgoal 12.2.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O4 *
ILA6 : O3 ++ O4 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope1
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : newNameScopes N Len EE1 EE2
============================
 O_A = O_B
 < apply append_unique to ILA6 ILB5.

Subgoal 12.2.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_B N Len EE1 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O3 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O4 *
ILA6 : O3 ++ O4 = O_B
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope1
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : newNameScopes N Len EE1 EE2
============================
 O_B = O_B
 < search.

Subgoal 13.1:

Variables: FE EE_B X Body EE_A' EE_B' O_B N Len Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A' EE_B
ILA1 : lookup Fields "null" trueVal
============================
 newNameScopes N Len EE_A' EE_B'
 < ILB: case ILB.

Subgoal 13.1.1:

Variables: FE X Body EE_A' EE_B' N Len Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B'
ILA1 : lookup Fields "null" trueVal
ILB : lookup Fields "null" trueVal
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 13.1.2:

Variables: FE EE_B X Body EE_A' EE_B' O_B N Len Fields Hd Scope EE1 O1 Tl O2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B
ILA1 : lookup Fields "null" trueVal
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O1
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE1 Tl X Body EE_B' O2
ILB5 : O1 ++ O2 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookup_unique to ILA1 ILB.

Subgoal 13.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsV.

Subgoal 13.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
============================
 newNameScopes N Len EE_A' EE_B'
 < ILB: case ILB.

Subgoal 13.2.1:

Variables: FE EE_A X Body EE_A' EE_B' O_A N Len Hd Scope EE1 O1 Tl O2 Fields
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B'
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" trueVal
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookup_unique to ILA1 ILB.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookup_is_value to _ ILA2.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookup_unique to ILA2 ILB1.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
============================
 newNameScopes N Len EE_A' EE_B'
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsEE1+.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 newNameScopes N Len EE_A' EE_B'
 < IsEE2+: apply evalStmt_isCtx to _ _ _ ILB2.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2)
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsEE2+.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < NNS': apply IH_C_S to _ _ _ _ ILA3 ILB2 _.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2)
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookup_unique to ILA4 ILB3.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2)
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookup_is_value to _ ILA4.

Subgoal 13.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
NNS' : newNameScopes N Len (Scope::EE1) (Scope1::EE2)
H7 : is_value Tl1
============================
 newNameScopes N Len EE_A' EE_B'
 < NNS': case NNS'.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 newNameScopes N Len EE_A' EE_B'
 < LenB: apply length_exists_list_pair_string_value to IsB.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
============================
 newNameScopes N Len EE_A' EE_B'
 < IsN2: apply length_is to LenB.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
============================
 newNameScopes N Len EE_A' EE_B'
 < P: apply plus_integer_total to _ IsN2 with
        N1 = 1.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
============================
 newNameScopes N Len EE_A' EE_B'
 < LenEE_B+: assert length ([(X, Hd1)]::EE_B) N3.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd1)]::EE_B) N3
============================
 newNameScopes N Len EE_A' EE_B'
 < LenEE2+: apply evalStmt_keep_scopes to _ _ _ ILB2 LenEE_B+.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2 N3
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd1)]::EE_B) N3
LenEE2+ : length (Scope1::EE2) N3
============================
 newNameScopes N Len EE_A' EE_B'
 < apply length_unique to LenEE2+ NNS'.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd1)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
============================
 newNameScopes N Len EE_A' EE_B'
 < LEq: apply newNameScopes_length to NNS LenB.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd1)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
LEq : Len <= N2
============================
 newNameScopes N Len EE_A' EE_B'
 < L: apply lt_plus_one to P _.

Subgoal 13.2.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4 N1 SNames BNames N2
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : length (Scope1::EE2) Len
NNS'1 : drop N1 (Scope::EE1) (Scope1::EE2)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (Scope1::EE2) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd1)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
LEq : Len <= N2
L : N2 < Len
============================
 newNameScopes N Len EE_A' EE_B'
 < apply less_lesseq_flip_false to L LEq.

Subgoal 13.2.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope1
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : newNameScopes N Len EE1 EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_IL to _ _ _ _ _ _ ILA5 ILB4 NNS'.

Subgoal 13.2.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_IL : forall FE EE_A EE_B V X Body EE_A' EE_B' O_A O_B N Len,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            iterateList FE EE_A V X Body EE_A' O_A * -> iterateList FE EE_B V X Body EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd1
ILA3 : evalStmt FE ([(X, Hd1)]::EE_A) Body (Scope1::EE1) O1 *
ILA4 : lookup Fields "tail" Tl1
ILA5 : iterateList FE EE1 Tl1 X Body EE_A' O2 *
ILA6 : O1 ++ O2 = O_A
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = O_B
H2 : is_value Hd1
H3 : is_list (is_pair is_string is_value) Scope1
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_pair is_string is_value) Scope1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_value Tl1
NNS' : newNameScopes N Len EE1 EE2
H8 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Proof completed.
 < Add_Ext_Size exactEval:host:evalExpr,
   exactEval:host:evalArgs,
   exactEval:host:evalRecFields,
   exactEval:host:evalStmt
   with iterateList FE EE V X Body EE' O.

Proof completed.
 < Add_Proj_Rel exactEval:host:evalExpr,
   exactEval:host:evalArgs,
   exactEval:host:evalRecFields,
   exactEval:host:evalStmt
   with iterateList FE EE V X Body EE' O.

Proof completed.
 < Prove exactEval:host:evalExpr_newNameScopes_exists_ES,
         exactEval:host:evalStmt_newNameScopes_exists_ES,
         exactEval:host:evalArgs_newNameScopes_exists_ES,
         exactEval:host:evalRecFields_newNameScopes_exists_ES
   with
      iterateList_newNameScopes_exists_ES : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsA : is_list (is_list (is_pair is_string is_value)) EE_A ->
         IsB : is_list (is_list (is_pair is_string is_value)) EE_B ->
         ILB : <iterateList {ES}> FE EE_B V X Body EE_B' O ES ->
         NNS : newNameScopes N Len EE_A EE_B ->
         exists EE_A',
           <iterateList {ES}> FE EE_A V X Body EE_A' O ES
      on ILB as IH_IL.

Subgoal 1.27:

Variables: FE EE_A EE_B' N Len Ty
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB : <evalExpr {ES}> FE EE_B' (nil Ty) (recVal [("null", trueVal)]) EE_B' [] 1 @
NNS : newNameScopes N Len EE_A EE_B'
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (nil Ty) (recVal [("null", trueVal)]) EE_A' [] 1
 < search.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < EvA1: apply IH_E to _ _ _ _ EvB3 NNS.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < EvB1': apply drop_ext_size_evalExpr to EvB3.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2
EvB1' : evalExpr FE EE_B E1 V1 EE1 O2
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < EvA1': apply drop_ext_size_evalExpr to EvA1.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2
EvB1' : evalExpr FE EE_B E1 V1 EE1 O2
EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' _.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2
EvB1' : evalExpr FE EE_B E1 V1 EE1 O2
EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2
NNS' : newNameScopes N Len EE_A' EE1
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvB1'.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2
EvB1' : evalExpr FE EE_B E1 V1 EE1 O2
EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2
NNS' : newNameScopes N Len EE_A' EE1
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvA1'.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2
EvB1' : evalExpr FE EE_B E1 V1 EE1 O2
EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2
NNS' : newNameScopes N Len EE_A' EE1
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_A'
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < apply IH_E to _ _ _ _ EvB4 NNS'.

Subgoal 1.28:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 V2 V1 E2 E1 EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 E2 V2 EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O2 N2
EvB1' : evalExpr FE EE_B E1 V1 EE1 O2
EvA1' : evalExpr FE EE_A E1 V1 EE_A' O2
NNS' : newNameScopes N Len EE_A' EE1
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : <evalExpr {ES}> FE EE_A' E2 V2 EE_A'1 O3 N3
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O ES
 < search.

Subgoal 1.29:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (head E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "head" V
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (head E1) V EE_A' O ES
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (head E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "head" V
H1 : is_expr E1
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (head E1) V EE_A' O ES
 < apply IH_E to _ _ _ _ EvB2 NNS.

Subgoal 1.29:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (head E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "head" V
H1 : is_expr E1
H2 : <evalExpr {ES}> FE EE_A E1 (recVal Fields) EE_A' O N2
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (head E1) V EE_A' O ES
 < search.

Subgoal 1.30:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (tail E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "tail" V
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (tail E1) V EE_A' O ES
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (tail E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "tail" V
H1 : is_expr E1
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (tail E1) V EE_A' O ES
 < apply IH_E to _ _ _ _ EvB2 NNS.

Subgoal 1.30:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (tail E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "tail" V
H1 : is_expr E1
H2 : <evalExpr {ES}> FE EE_A E1 (recVal Fields) EE_A' O N2
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (tail E1) V EE_A' O ES
 < search.

Subgoal 1.31:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (null E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "null" V
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (null E1) V EE_A' O ES
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (null E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "null" V
H1 : is_expr E1
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (null E1) V EE_A' O ES
 < apply IH_E to _ _ _ _ EvB2 NNS.

Subgoal 1.31:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Fields E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (null E1) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (recVal Fields) EE_B' O N2 *
EvB3 : lookup Fields "null" V
H1 : is_expr E1
H2 : <evalExpr {ES}> FE EE_A E1 (recVal Fields) EE_A' O N2
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (null E1) V EE_A' O ES
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < EvA1: apply IH_E to _ _ _ _ EvB3 NNS.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < EvB1': apply drop_ext_size_evalExpr to EvB3.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2
EvB1' : evalExpr FE EE_B L LV EE1 O2
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < EvA1': apply drop_ext_size_evalExpr to EvA1.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2
EvB1' : evalExpr FE EE_B L LV EE1 O2
EvA1' : evalExpr FE EE_A L LV EE_A' O2
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' _.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2
EvB1' : evalExpr FE EE_B L LV EE1 O2
EvA1' : evalExpr FE EE_A L LV EE_A' O2
NNS' : newNameScopes N Len EE_A' EE1
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvB1'.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2
EvB1' : evalExpr FE EE_B L LV EE1 O2
EvA1' : evalExpr FE EE_A L LV EE_A' O2
NNS' : newNameScopes N Len EE_A' EE1
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvA1'.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2
EvB1' : evalExpr FE EE_B L LV EE1 O2
EvA1' : evalExpr FE EE_A L LV EE_A' O2
NNS' : newNameScopes N Len EE_A' EE1
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_A'
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < apply IH_E to _ _ _ _ EvB4 NNS'.

Subgoal 1.32:

Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 LV EE1 O2 Idx O3 I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (index L I) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE EE_B L LV EE1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE1 I (intVal Idx) EE_B' O3 N3 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvA1 : <evalExpr {ES}> FE EE_A L LV EE_A' O2 N2
EvB1' : evalExpr FE EE_B L LV EE1 O2
EvA1' : evalExpr FE EE_A L LV EE_A' O2
NNS' : newNameScopes N Len EE_A' EE1
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : <evalExpr {ES}> FE EE_A' I (intVal Idx) EE_A'1 O3 N3
============================
 exists EE_A', <evalExpr {ES}> FE EE_A (index L I) V EE_A' O ES
 < search.

Subgoal 1.33:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 V1 I E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE_B' O N2 *
EvB3 : listLength V1 I
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O ES
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 V1 I E1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE_B' O N2 *
EvB3 : listLength V1 I
H1 : is_expr E1
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O ES
 < apply IH_E to _ _ _ _ EvB2 NNS.

Subgoal 1.33:

Variables: FE EE_A EE_B EE_B' O N Len ES N2 V1 I E1 EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 EE_B' O N2 *
EvB3 : listLength V1 I
H1 : is_expr E1
H2 : <evalExpr {ES}> FE EE_A E1 V1 EE_A' O N2
============================
 exists EE_A',
   <evalExpr {ES}> FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O ES
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < EvA1: apply IH_E to _ _ IsA _ EvB3 _.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < EvB1': apply drop_ext_size_evalExpr to EvB3.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < EvA1': apply drop_ext_size_evalExpr to EvA1.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvB1'.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvA1'.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' _.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < EvA2: apply IH_E to _ _ _ _ EvB4 NNS'.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < EvB2': apply drop_ext_size_evalExpr to EvB4.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < EvA2': apply drop_ext_size_evalExpr to EvA2.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA2' EvB2' _.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < IsA': apply evalExpr_isCtx to _ _ _ EvA2'.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvB2'.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < LA: apply newNameScopes_lookupScopes to IsA' _ _ EvB5.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
LA : lookupScopes L EE_A'1 LV
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply evalExpr_isValue to _ _ _ EvB2'.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
LA : lookupScopes L EE_A'1 LV
H7 : is_value V
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply lookupScopes_is to _ EvB5.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
LA : lookupScopes L EE_A'1 LV
H7 : is_value V
H8 : is_value LV
H9 : is_string L
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply updateListIndex_is to _ _ EvB6.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
LA : lookupScopes L EE_A'1 LV
H7 : is_value V
H8 : is_value LV
H9 : is_string L
H10 : is_value LV2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvB2'.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
LA : lookupScopes L EE_A'1 LV
H7 : is_value V
H8 : is_value LV
H9 : is_string L
H10 : is_value LV2
H11 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply newNameScopes_replaceScopes to _ _ _ _ NNS'' EvB7.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_A' EE_A'1 RA
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listUpdate L I E) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N3 + N2 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) EE1 O2 N3 *
EvB4 : <evalExpr {ES}> FE EE1 E V EE2 O3 N2 *
EvB5 : lookupScopes L EE2 LV
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 EE2 EE_B'
EvB8 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) EE_A' O2 N3
EvB1' : evalExpr FE (Scope::EE_B) I (intVal N1) EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) I (intVal N1) EE_A' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
NNS' : newNameScopes N Len EE_A' EE1
EvA2 : <evalExpr {ES}> FE EE_A' E V EE_A'1 O3 N2
EvB2' : evalExpr FE EE1 E V EE2 O3
EvA2' : evalExpr FE EE_A' E V EE_A'1 O3
NNS'' : newNameScopes N Len EE_A'1 EE2
IsA' : is_list (is_list (is_pair is_string is_value)) EE_A'1
H6 : is_list (is_list (is_pair is_string is_value)) EE2
LA : lookupScopes L EE_A'1 LV
H7 : is_value V
H8 : is_value LV
H9 : is_string L
H10 : is_value LV2
H11 : is_list (is_list (is_pair is_string is_value)) EE2
H12 : replaceScopes L LV2 EE_A'1 RA
H13 : newNameScopes N Len RA EE_B'
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < search.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < case IsS.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < EvA1: apply IH_E to _ _ _ _ EvB3 NNS'.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < EvB3': apply drop_ext_size_evalExpr to EvB3.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2
EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < EvA1': apply drop_ext_size_evalExpr to EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2
EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB3' NNS'.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2
EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2
NNS'' : newNameScopes N Len EE_A' EE1
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < apply evalExpr_isValue to _ _ _ EvA1'.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2
EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2
NNS'' : newNameScopes N Len EE_A' EE1
H4 : is_value LV
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvA1'.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2
EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2
NNS'' : newNameScopes N Len EE_A' EE1
H4 : is_value LV
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < apply evalExpr_isCtx to _ _ _ EvB3'.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2
EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2
NNS'' : newNameScopes N Len EE_A' EE1
H4 : is_value LV
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
H6 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < apply IH_IL to _ _ _ _ _ _ EvB4 NNS''.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV EE1 O2 O3 Body L X EE_A' EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (listForeach X L Body) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N4 = ES
EvB2 : N2 + N3 = N4
EvB3 : <evalExpr {ES}> FE (Scope::EE_B) L LV EE1 O2 N2 *
EvB4 : <iterateList {ES}> FE EE1 LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvA1 : <evalExpr {ES}> FE (Scope::EE_A) L LV EE_A' O2 N2
EvB3' : evalExpr FE (Scope::EE_B) L LV EE1 O2
EvA1' : evalExpr FE (Scope::EE_A) L LV EE_A' O2
NNS'' : newNameScopes N Len EE_A' EE1
H4 : is_value LV
H5 : is_list (is_list (is_pair is_string is_value)) EE_A'
H6 : is_list (is_list (is_pair is_string is_value)) EE1
H7 : <iterateList {ES}> FE EE_A' LV X Body EE_A'1 O3 N3
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < search.

Subgoal 5.1:

Variables: FE EE_A X Body EE_B' N Len Fields
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
ILB : <iterateList {ES}> FE EE_B' (recVal Fields) X Body EE_B' [] 0 @
NNS : newNameScopes N Len EE_A EE_B'
ILB1 : lookup Fields "null" trueVal
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' [] 0
 < search.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < case IsV.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < apply lookup_is_value to _ ILB3.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < ILA1: apply IH_S to _ _ _ _ ILB4 NNS.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < ILB5': apply drop_ext_size_evalStmt to ILB4.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < ILA1': apply drop_ext_size_evalStmt to ILA1.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < NNS': apply evalStmt_newNameScopes to _ _ _ _ ILA1' ILB5' _.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
NNS' : newNameScopes N Len EE_A' (Scope::EE1)
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILB5'.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
NNS' : newNameScopes N Len EE_A' (Scope::EE1)
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < case IsEE1+.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
NNS' : newNameScopes N Len EE_A' (Scope::EE1)
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < IsEE_A': apply evalStmt_isCtx to _ _ _ ILA1'.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
NNS' : newNameScopes N Len EE_A' (Scope::EE1)
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < apply lookup_is_value to _ ILB5.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
NNS' : newNameScopes N Len EE_A' (Scope::EE1)
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < NNS': case NNS'.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < LenB: apply length_exists_list_pair_string_value to IsB.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N4
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < IsN5: apply length_is to LenB.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N4
IsN5 : is_integer N4
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < P: apply plus_integer_total to _ IsN5 with
        N1 = 1.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 N5
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N4
IsN5 : is_integer N4
P : 1 + N4 = N5
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < LenEE_B+: assert length ([(X, Hd)]::EE_B) N5.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 N5
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N4
IsN5 : is_integer N4
P : 1 + N4 = N5
LenEE_B+ : length ([(X, Hd)]::EE_B) N5
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < LenEE2+: apply evalStmt_keep_scopes to _ _ _ ILB5' LenEE_B+.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4 N5
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N4
IsN5 : is_integer N4
P : 1 + N4 = N5
LenEE_B+ : length ([(X, Hd)]::EE_B) N5
LenEE2+ : length (Scope::EE1) N5
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < apply length_unique to LenEE2+ NNS'.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N4
IsN5 : is_integer N4
P : 1 + N4 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenEE2+ : length (Scope::EE1) Len
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < LEq: apply newNameScopes_length to NNS LenB.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N4
IsN5 : is_integer N4
P : 1 + N4 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenEE2+ : length (Scope::EE1) Len
LEq : Len <= N4
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < L: apply lt_plus_one to P _.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) EE_A'
H5 : is_value Tl
NNS' : length (Scope::EE1) Len
NNS'1 : drop N1 EE_A' (Scope::EE1)
NNS'2 : take N1 EE_A' N
NNS'3 : names N SNames
NNS'4 : names (Scope::EE1) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N4
IsN5 : is_integer N4
P : 1 + N4 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenEE2+ : length (Scope::EE1) Len
LEq : Len <= N4
L : N4 < Len
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < apply less_lesseq_flip_false to L LEq.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields AR
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE_A' : is_list (is_list (is_pair is_string is_value)) (Scope::AR)
H5 : is_value Tl
NNS' : newNameScopes N Len AR EE1
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < case IsEE_A'.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields AR
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_value Tl
NNS' : newNameScopes N Len AR EE1
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) AR
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < apply IH_IL to _ _ _ _ _ _ ILB6 NNS'.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Hd Scope EE1 O2 Tl O3 Fields AR EE_A'1
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IH_IL : forall FE EE_A EE_B V X Body EE_B' O N Len ES,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <iterateList {ES}> FE EE_B V X Body EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <iterateList {ES}> FE EE_A V X Body EE_A' O ES
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
ILB : <iterateList {ES}> FE EE_B (recVal Fields) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : lookup Fields "null" falseVal
ILB3 : lookup Fields "head" Hd
ILB4 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB5 : lookup Fields "tail" Tl
ILB6 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
ILA1 : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2
ILB5' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
ILA1' : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_value Tl
NNS' : newNameScopes N Len AR EE1
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) AR
H8 : <iterateList {ES}> FE AR Tl X Body EE_A'1 O3 N3
============================
 exists EE_A', <iterateList {ES}> FE EE_A (recVal Fields) X Body EE_A' O ES
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_ctx_names,
         exactEval:host:evalStmt_ctx_names,
         exactEval:host:evalArgs_ctx_names,
         exactEval:host:evalRecFields_ctx_names
   with
      iterateList_ctx_names : forall FE EE V X Body EE' O Ctx N Sc Ctx',
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsEE : is_list (is_list (is_pair is_string is_value)) EE ->
         IsCtx : is_list (is_list is_string) Ctx ->
         Ctxs : ctx_names EE Ctx ->
         BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx') ->
         IL : iterateList FE EE V X Body EE' O ->
         ctx_names EE' Ctx
      on IL as IH_IL.

Subgoal 1.27:

Variables: FE EE' Ctx N Ty
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE' Ctx
EN : exprNames Ctx (nil Ty) N
Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @
============================
 ctx_names EE' Ctx
 < search.

Subgoal 1.28:

Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (cons E1 E2) N
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 ctx_names EE' Ctx
 < case IsE.

Subgoal 1.28:

Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (cons E1 E2) N
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 ctx_names EE' Ctx
 < EN: case EN.

Subgoal 1.28:

Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 N2 N3
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
============================
 ctx_names EE' Ctx
 < C: apply IH_E to _ _ _ _ Ctxs EN Ev1.

Subgoal 1.28:

Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 N2 N3
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
C : ctx_names EE3 Ctx
============================
 ctx_names EE' Ctx
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 N2 N3
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
C : ctx_names EE3 Ctx
H3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 ctx_names EE' Ctx
 < apply IH_E to _ _ _ _ C EN1 Ev2.

Subgoal 1.28:

Variables: FE EE EE' O Ctx N EE3 O2 O3 V2 V1 E2 E1 N2 N3
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = N
C : ctx_names EE3 Ctx
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : ctx_names EE' Ctx
============================
 ctx_names EE' Ctx
 < search.

Subgoal 1.29:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (head E1) N
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
============================
 ctx_names EE' Ctx
 < case IsE.

Subgoal 1.29:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (head E1) N
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
============================
 ctx_names EE' Ctx
 < EN: case EN.

Subgoal 1.29:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
EN : exprNames Ctx E1 N
============================
 ctx_names EE' Ctx
 < apply IH_E to _ _ _ _ Ctxs EN Ev1.

Subgoal 1.29:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
EN : exprNames Ctx E1 N
H2 : ctx_names EE' Ctx
============================
 ctx_names EE' Ctx
 < search.

Subgoal 1.30:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (tail E1) N
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
============================
 ctx_names EE' Ctx
 < case IsE.

Subgoal 1.30:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (tail E1) N
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 ctx_names EE' Ctx
 < EN: case EN.

Subgoal 1.30:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
EN : exprNames Ctx E1 N
============================
 ctx_names EE' Ctx
 < apply IH_E to _ _ _ _ Ctxs EN Ev1.

Subgoal 1.30:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
EN : exprNames Ctx E1 N
H2 : ctx_names EE' Ctx
============================
 ctx_names EE' Ctx
 < search.

Subgoal 1.31:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (null E1) N
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
============================
 ctx_names EE' Ctx
 < case IsE.

Subgoal 1.31:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (null E1) N
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
============================
 ctx_names EE' Ctx
 < EN: case EN.

Subgoal 1.31:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
EN : exprNames Ctx E1 N
============================
 ctx_names EE' Ctx
 < apply IH_E to _ _ _ _ Ctxs EN Ev1.

Subgoal 1.31:

Variables: FE EE V EE' O Ctx N Fields E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
EN : exprNames Ctx E1 N
H2 : ctx_names EE' Ctx
============================
 ctx_names EE' Ctx
 < search.

Subgoal 1.32:

Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (index L I) N
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 ctx_names EE' Ctx
 < case IsE.

Subgoal 1.32:

Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (index L I) N
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 ctx_names EE' Ctx
 < EN: case EN.

Subgoal 1.32:

Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L N2 N3
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L N2
EN1 : exprNames Ctx I N3
EN2 : N2 ++ N3 = N
============================
 ctx_names EE' Ctx
 < C: apply IH_E to _ _ _ _ Ctxs EN Ev1.

Subgoal 1.32:

Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L N2 N3
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L N2
EN1 : exprNames Ctx I N3
EN2 : N2 ++ N3 = N
C : ctx_names EE3 Ctx
============================
 ctx_names EE' Ctx
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.32:

Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L N2 N3
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L N2
EN1 : exprNames Ctx I N3
EN2 : N2 ++ N3 = N
C : ctx_names EE3 Ctx
H3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 ctx_names EE' Ctx
 < apply IH_E to _ _ _ _ C EN1 Ev2.

Subgoal 1.32:

Variables: FE EE V EE' O Ctx N LV EE3 O2 Idx O3 I L N2 N3
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L N2
EN1 : exprNames Ctx I N3
EN2 : N2 ++ N3 = N
C : ctx_names EE3 Ctx
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : ctx_names EE' Ctx
============================
 ctx_names EE' Ctx
 < search.

Subgoal 1.33:

Variables: FE EE EE' O Ctx N V1 I E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (exactEval:list:length E1) N
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
============================
 ctx_names EE' Ctx
 < case IsE.

Subgoal 1.33:

Variables: FE EE EE' O Ctx N V1 I E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (exactEval:list:length E1) N
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
============================
 ctx_names EE' Ctx
 < EN: case EN.

Subgoal 1.33:

Variables: FE EE EE' O Ctx N V1 I E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
EN : exprNames Ctx E1 N
============================
 ctx_names EE' Ctx
 < apply IH_E to _ _ _ _ Ctxs EN Ev1.

Subgoal 1.33:

Variables: FE EE EE' O Ctx N V1 I E1
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
EN : exprNames Ctx E1 N
H2 : ctx_names EE' Ctx
============================
 ctx_names EE' Ctx
 < search.

Subgoal 2.15:

Variables: FE EE EE' O Ctx Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) N Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
============================
 ctx_names EE' Ctx'
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O Ctx Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) N Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 ctx_names EE' Ctx'
 < SN: case SN.

Subgoal 2.15.1:

Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N
============================
 ctx_names EE' Ctx'
 < C: apply IH_E to _ _ _ _ Ctxs SN1 Ev1.

Subgoal 2.15.1:

Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N
C : ctx_names EE2 Ctx'
============================
 ctx_names EE' Ctx'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.15.1:

Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N
C : ctx_names EE2 Ctx'
H4 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 ctx_names EE' Ctx'
 < C': apply IH_E to _ _ _ _ C SN2 Ev2.

Subgoal 2.15.1:

Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N
C : ctx_names EE2 Ctx'
H4 : is_list (is_list (is_pair is_string is_value)) EE2
C' : ctx_names EE4 Ctx'
============================
 ctx_names EE' Ctx'
 < apply evalExpr_isCtx to _ _ _ Ev2.

Subgoal 2.15.1:

Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N
C : ctx_names EE2 Ctx'
H4 : is_list (is_list (is_pair is_string is_value)) EE2
C' : ctx_names EE4 Ctx'
H5 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 ctx_names EE' Ctx'
 < apply ctx_names_replaceScopes to _ _ C' Ev5.

Subgoal 2.15.1:

Variables: FE EE EE' O Ctx' N N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N
C : ctx_names EE2 Ctx'
H4 : is_list (is_list (is_pair is_string is_value)) EE2
C' : ctx_names EE4 Ctx'
H5 : is_list (is_list (is_pair is_string is_value)) EE4
H6 : ctx_names EE' Ctx'
============================
 ctx_names EE' Ctx'
 < search.

Subgoal 2.15.2:

Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N2
============================
 ctx_names EE' Ctx'
 < C: apply IH_E to _ _ _ _ Ctxs SN1 Ev1.

Subgoal 2.15.2:

Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N2
C : ctx_names EE2 Ctx'
============================
 ctx_names EE' Ctx'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.15.2:

Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N2
C : ctx_names EE2 Ctx'
H4 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 ctx_names EE' Ctx'
 < C': apply IH_E to _ _ _ _ C SN2 Ev2.

Subgoal 2.15.2:

Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N2
C : ctx_names EE2 Ctx'
H4 : is_list (is_list (is_pair is_string is_value)) EE2
C' : ctx_names EE4 Ctx'
============================
 ctx_names EE' Ctx'
 < apply evalExpr_isCtx to _ _ _ Ev2.

Subgoal 2.15.2:

Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N2
C : ctx_names EE2 Ctx'
H4 : is_list (is_list (is_pair is_string is_value)) EE2
C' : ctx_names EE4 Ctx'
H5 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 ctx_names EE' Ctx'
 < apply ctx_names_replaceScopes to _ _ C' Ev5.

Subgoal 2.15.2:

Variables: FE EE EE' O Ctx' N1 EE2 O2 V EE4 O3 LV LV2 E I L NI NE N2
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N1) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N1 V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
SN : not_mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = N2
C : ctx_names EE2 Ctx'
H4 : is_list (is_list (is_pair is_string is_value)) EE2
C' : ctx_names EE4 Ctx'
H5 : is_list (is_list (is_pair is_string is_value)) EE4
H6 : ctx_names EE' Ctx'
============================
 ctx_names EE' Ctx'
 < search.

Subgoal 2.16:

Variables: FE EE EE' O Ctx Ctx' N LV EE3 O2 O3 Body L X
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listForeach X L Body) N Ctx'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 ctx_names EE' Ctx'
 < case IsS.

Subgoal 2.16:

Variables: FE EE EE' O Ctx Ctx' N LV EE3 O2 O3 Body L X
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listForeach X L Body) N Ctx'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 ctx_names EE' Ctx'
 < SN: case SN.

Subgoal 2.16:

Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Ctx2
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L NL
SN1 : stmtNames ([X]::Ctx') Body NB Ctx2
SN2 : NL ++ NB = N
============================
 ctx_names EE' Ctx'
 < M: apply stmtNames_keep_older to _ _ SN1.

Subgoal 2.16:

Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L NL
SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx')
SN2 : NL ++ NB = N
M : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 ctx_names EE' Ctx'
 < apply IH_E to _ _ _ _ _ SN Ev1.

Subgoal 2.16:

Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L NL
SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx')
SN2 : NL ++ NB = N
M : forall X1, mem X1 [X] -> mem X1 Scope'
H4 : ctx_names EE3 Ctx'
============================
 ctx_names EE' Ctx'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L NL
SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx')
SN2 : NL ++ NB = N
M : forall X1, mem X1 [X] -> mem X1 Scope'
H4 : ctx_names EE3 Ctx'
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 ctx_names EE' Ctx'
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L NL
SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx')
SN2 : NL ++ NB = N
M : forall X1, mem X1 [X] -> mem X1 Scope'
H4 : ctx_names EE3 Ctx'
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_value LV
============================
 ctx_names EE' Ctx'
 < apply IH_IL to _ _ _ _ _ _ _ SN1 Ev2.

Subgoal 2.16:

Variables: FE EE EE' O Ctx' N LV EE3 O2 O3 Body L X NL NB Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L NL
SN1 : stmtNames ([X]::Ctx') Body NB (Scope'::Ctx')
SN2 : NL ++ NB = N
M : forall X1, mem X1 [X] -> mem X1 Scope'
H4 : ctx_names EE3 Ctx'
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_value LV
H7 : ctx_names EE' Ctx'
============================
 ctx_names EE' Ctx'
 < search.

Subgoal 5.1:

Variables: FE X Body EE' Ctx N Sc Ctx' Fields
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx')
IL : iterateList FE EE' (recVal Fields) X Body EE' [] @
IL1 : lookup Fields "null" trueVal
============================
 ctx_names EE' Ctx
 < search.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Sc Ctx' Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx')
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
============================
 ctx_names EE' Ctx
 < case IsV.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Sc Ctx' Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx')
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 ctx_names EE' Ctx
 < apply lookup_is_value to _ IL2.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Sc Ctx' Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx')
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 ctx_names EE' Ctx
 < apply lookup_is_value to _ IL4.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Sc Ctx' Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Sc::Ctx')
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 ctx_names EE' Ctx
 < apply stmtNames_keep_older to _ _ BN.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 ctx_names EE' Ctx
 < assert ctx_names ([(X, Hd)]::EE) ([X]::Ctx).

Subgoal 5.2.1:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 ctx_names ([(X, Hd)]::EE) ([X]::Ctx)
 < unfold .

Subgoal 5.2.1.1:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 forall K I, mem (K, I) [(X, Hd)] -> mem K [X]
 < intros M.

Subgoal 5.2.1.1:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' K I
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
M : mem (K, I) [(X, Hd)]
============================
 mem K [X]
 < M: case M.

Subgoal 5.2.1.1.1:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 mem X [X]
 < search.

Subgoal 5.2.1.1.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' K I
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
M : mem (K, I) []
============================
 mem K [X]
 < case M.

Subgoal 5.2.1.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 forall K, mem K [X] -> exists I, mem (K, I) [(X, Hd)]
 < intros M.

Subgoal 5.2.1.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' K
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
M : mem K [X]
============================
 exists I, mem (K, I) [(X, Hd)]
 < M: case M.

Subgoal 5.2.1.2.1:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 exists I, mem (X, I) [(X, Hd)]
 < search.

Subgoal 5.2.1.2.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope' K
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
M : mem K []
============================
 exists I, mem (K, I) [(X, Hd)]
 < case M.

Subgoal 5.2.1.3:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 ctx_names EE Ctx
 < search.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx)
============================
 ctx_names EE' Ctx
 < Ctxs': apply IH_S to _ _ _ _ _ BN IL3.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx)
Ctxs' : ctx_names (Scope::EE3) (Scope'::Ctx)
============================
 ctx_names EE' Ctx
 < case Ctxs'.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx)
H6 : forall K I, mem (K, I) Scope -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope
H8 : ctx_names EE3 Ctx
============================
 ctx_names EE' Ctx
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL3.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx)
H6 : forall K I, mem (K, I) Scope -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope
H8 : ctx_names EE3 Ctx
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 ctx_names EE' Ctx
 < case IsEE3+.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx)
H6 : forall K I, mem (K, I) Scope -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope
H8 : ctx_names EE3 Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 ctx_names EE' Ctx
 < apply IH_IL to _ _ _ _ _ _ _ BN IL5.

Subgoal 5.2:

Variables: FE EE X Body EE' O Ctx N Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IH_IL : forall FE EE V X Body EE' O Ctx N Sc Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body N (Sc::Ctx') -> iterateList FE EE V X Body EE' O * ->
          ctx_names EE' Ctx
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body N (Scope'::Ctx)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X1, mem X1 [X] -> mem X1 Scope'
H5 : ctx_names ([(X, Hd)]::EE) ([X]::Ctx)
H6 : forall K I, mem (K, I) Scope -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) Scope
H8 : ctx_names EE3 Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
H11 : ctx_names EE' Ctx
============================
 ctx_names EE' Ctx
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_newNameScopes_exists_back,
         exactEval:host:evalStmt_newNameScopes_exists_back,
         exactEval:host:evalArgs_newNameScopes_exists_back,
         exactEval:host:evalRecFields_newNameScopes_exists_back
   with
      iterateList_newNameScopes_exists_back : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsA : is_list (is_list (is_pair is_string is_value)) EE_A ->
         IsB : is_list (is_list (is_pair is_string is_value)) EE_B ->
         IsCtx : is_list (is_list is_string) Ctx ->
         Ctxs : ctx_names EE_B Ctx ->
         BN : stmtNames ([X]::Ctx) Body [] Ctx' ->
         ILA : iterateList FE EE_A V X Body EE_A' O ->
         NNS : newNameScopes N Len EE_A EE_B ->
         exists EE_B',
           iterateList FE EE_B V X Body EE_B' O
      on ILA as IH_IL.

Subgoal 1.27:

Variables: FE EE_B Ctx EE_A' N Len Ty
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (nil Ty) []
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B
============================
 exists EE_B', evalExpr FE EE_B (nil Ty) (recVal [("null", trueVal)]) EE_B' []
 < search.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (cons E1 E2) []
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (cons E1 E2) []
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < EN: case EN.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 N2 N3
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N2
EN1 : exprNames Ctx E2 N3
EN2 : N2 ++ N3 = []
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < case EN2.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < C: apply evalExpr_ctx_names to _ _ _ _ Ctxs EN EvB1.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx
NNS' : newNameScopes N Len EE1 EE_B'
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < apply IH_E to _ _ _ _ _ C EN1 EvA2 NNS'.

Subgoal 1.28:

Variables: FE EE_A EE_B Ctx EE_A' O N Len EE1 O2 O3 V2 V1 E2 E1 EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx
NNS' : newNameScopes N Len EE1 EE_B'
H5 : evalExpr FE EE_B' E2 V2 EE_B'1 O3
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < search.

Subgoal 1.29:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (head E1) []
EvA : evalExpr FE EE_A (head E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "head" V
============================
 exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (head E1) []
EvA : evalExpr FE EE_A (head E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "head" V
H1 : is_expr E1
============================
 exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
 < EN: case EN.

Subgoal 1.29:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (head E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "head" V
H1 : is_expr E1
EN : exprNames Ctx E1 []
============================
 exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
 < apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS.

Subgoal 1.29:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (head E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "head" V
H1 : is_expr E1
EN : exprNames Ctx E1 []
H2 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O
============================
 exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
 < search.

Subgoal 1.30:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (tail E1) []
EvA : evalExpr FE EE_A (tail E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "tail" V
============================
 exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (tail E1) []
EvA : evalExpr FE EE_A (tail E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
 < EN: case EN.

Subgoal 1.30:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (tail E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "tail" V
H1 : is_expr E1
EN : exprNames Ctx E1 []
============================
 exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
 < apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS.

Subgoal 1.30:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (tail E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "tail" V
H1 : is_expr E1
EN : exprNames Ctx E1 []
H2 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O
============================
 exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
 < search.

Subgoal 1.31:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (null E1) []
EvA : evalExpr FE EE_A (null E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "null" V
============================
 exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (null E1) []
EvA : evalExpr FE EE_A (null E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "null" V
H1 : is_expr E1
============================
 exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
 < EN: case EN.

Subgoal 1.31:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (null E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "null" V
H1 : is_expr E1
EN : exprNames Ctx E1 []
============================
 exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
 < apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS.

Subgoal 1.31:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len Fields E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (null E1) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "null" V
H1 : is_expr E1
EN : exprNames Ctx E1 []
H2 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O
============================
 exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (index L I) []
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (index L I) []
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < EN: case EN.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L N2 N3
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L N2
EN1 : exprNames Ctx I N3
EN2 : N2 ++ N3 = []
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < case EN2.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L []
EN1 : exprNames Ctx I []
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < EvB1: apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L []
EN1 : exprNames Ctx I []
EvB1 : evalExpr FE EE_B L LV EE_B' O2
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L []
EN1 : exprNames Ctx I []
EvB1 : evalExpr FE EE_B L LV EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L []
EN1 : exprNames Ctx I []
EvB1 : evalExpr FE EE_B L LV EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < C: apply evalExpr_ctx_names to _ _ _ _ Ctxs EN EvB1.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L []
EN1 : exprNames Ctx I []
EvB1 : evalExpr FE EE_B L LV EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L []
EN1 : exprNames Ctx I []
EvB1 : evalExpr FE EE_B L LV EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx
NNS' : newNameScopes N Len EE1 EE_B'
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < apply IH_E to _ _ _ _ _ C EN1 EvA2 NNS'.

Subgoal 1.32:

Variables: FE EE_A EE_B V Ctx EE_A' O N Len LV EE1 O2 Idx O3 I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EN : exprNames Ctx L []
EN1 : exprNames Ctx I []
EvB1 : evalExpr FE EE_B L LV EE_B' O2
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx
NNS' : newNameScopes N Len EE1 EE_B'
H5 : evalExpr FE EE_B' I (intVal Idx) EE_B'1 O3
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < search.

Subgoal 1.33:

Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 I E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (exactEval:list:length E1) []
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O *
EvA2 : listLength V1 I
============================
 exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 I E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (exactEval:list:length E1) []
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O *
EvA2 : listLength V1 I
H1 : is_expr E1
============================
 exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
 < EN: case EN.

Subgoal 1.33:

Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 I E1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O *
EvA2 : listLength V1 I
H1 : is_expr E1
EN : exprNames Ctx E1 []
============================
 exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
 < apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS.

Subgoal 1.33:

Variables: FE EE_A EE_B Ctx EE_A' O N Len V1 I E1 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O *
EvA2 : listLength V1 I
H1 : is_expr E1
EN : exprNames Ctx E1 []
H2 : evalExpr FE EE_B E1 V1 EE_B' O
============================
 exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names (Scope::EE_B) Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names (Scope::EE_B) Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < EN: case SN.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L NI NE
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I NI
EN2 : exprNames Ctx' E NE
EN3 : NI ++ NE = []
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < case EN3.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < EvB1: apply IH_E to _ _ _ _ _ Ctxs EN1 EvA1 _.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < C: apply evalExpr_ctx_names to _ _ _ _ Ctxs EN1 EvB1.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < EvB2: apply IH_E to _ _ _ _ _ C EN2 EvA2 NNS'.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < C': apply evalExpr_ctx_names to _ _ _ _ C EN2 EvB2.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA2 EvB2 _.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
NNS'' : newNameScopes N Len EE2 EE_B'1
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply newNameScopes_ctx_names_lookupScopes to NNS'' _ EN EvA3.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
NNS'' : newNameScopes N Len EE2 EE_B'1
H6 : lookupScopes L EE_B'1 LV
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply evalExpr_isValue to _ _ _ EvA2.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
NNS'' : newNameScopes N Len EE2 EE_B'1
H6 : lookupScopes L EE_B'1 LV
H7 : is_value V
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA2.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
NNS'' : newNameScopes N Len EE2 EE_B'1
H6 : lookupScopes L EE_B'1 LV
H7 : is_value V
H8 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply lookupScopes_is to _ EvA3.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
NNS'' : newNameScopes N Len EE2 EE_B'1
H6 : lookupScopes L EE_B'1 LV
H7 : is_value V
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_value LV
H10 : is_string L
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply updateListIndex_is to _ _ EvA4.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
NNS'' : newNameScopes N Len EE2 EE_B'1
H6 : lookupScopes L EE_B'1 LV
H7 : is_value V
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_value LV
H10 : is_string L
H11 : is_value LV2
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB2.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
NNS'' : newNameScopes N Len EE2 EE_B'1
H6 : lookupScopes L EE_B'1 LV
H7 : is_value V
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_value LV
H10 : is_string L
H11 : is_value LV2
H12 : is_list (is_list (is_pair is_string is_value)) EE_B'1
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < apply newNameScopes_replaceScopes_back to _ _ _ _ C' EN NNS'' EvA5.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope N1 EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 RB
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listUpdate L I E) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) I (intVal N1) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EN : mems L Ctx'
EN1 : exprNames Ctx' I []
EN2 : exprNames Ctx' E []
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N1) EE_B' O2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
C : ctx_names EE_B' Ctx'
NNS' : newNameScopes N Len EE1 EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
C' : ctx_names EE_B'1 Ctx'
NNS'' : newNameScopes N Len EE2 EE_B'1
H6 : lookupScopes L EE_B'1 LV
H7 : is_value V
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_value LV
H10 : is_string L
H11 : is_value LV2
H12 : is_list (is_list (is_pair is_string is_value)) EE_B'1
H13 : replaceScopes L LV2 EE_B'1 RB
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listUpdate L I E) EE_B' O
 < search.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names (Scope::EE_B) Ctx
SN : stmtNames Ctx (listForeach X L Body) [] Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < case IsS.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names (Scope::EE_B) Ctx
SN : stmtNames Ctx (listForeach X L Body) [] Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < SN: case SN.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X NL NB Ctx2
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L NL
SN1 : stmtNames ([X]::Ctx') Body NB Ctx2
SN2 : NL ++ NB = []
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < case SN2.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < EvB1: apply IH_E to _ _ _ _ _ _ SN EvA1 NNS'.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 _.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2
NNS'' : newNameScopes N Len EE1 EE_B'
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2
NNS'' : newNameScopes N Len EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2
NNS'' : newNameScopes N Len EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2
NNS'' : newNameScopes N Len EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
H6 : is_value LV
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < apply evalExpr_ctx_names to _ _ _ _ _ SN EvB1.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2
NNS'' : newNameScopes N Len EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
H6 : is_value LV
H7 : ctx_names EE_B' Ctx'
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < apply IH_IL to _ _ _ _ _ _ _ _ SN1 EvA2 NNS''.

Subgoal 2.16:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope LV EE1 O2 O3 Body L X Ctx2 EE_B' EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (listForeach X L Body) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
EvB1 : evalExpr FE (Scope::EE_B) L LV EE_B' O2
NNS'' : newNameScopes N Len EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
H6 : is_value LV
H7 : ctx_names EE_B' Ctx'
H8 : iterateList FE EE_B' LV X Body EE_B'1 O3
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (listForeach X L Body) EE_B' O
 < search.

Subgoal 5.1:

Variables: FE EE_B X Body Ctx EE_A' N Len Ctx' Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B
ILA1 : lookup Fields "null" trueVal
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' []
 < search.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < case IsV.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply lookup_is_value to _ ILA2.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply lookup_is_value to _ ILA4.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < assert ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx).

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
 < unfold .

Subgoal 5.2.1.1:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 forall K I, mem (K, I) [(X, Hd)] -> mem K [X]
 < intros M.

Subgoal 5.2.1.1:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields K I
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
M : mem (K, I) [(X, Hd)]
============================
 mem K [X]
 < M: case M.

Subgoal 5.2.1.1.1:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 mem X [X]
 < search.

Subgoal 5.2.1.1.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields K I
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
M : mem (K, I) []
============================
 mem K [X]
 < case M.

Subgoal 5.2.1.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 forall K, mem K [X] -> exists I, mem (K, I) [(X, Hd)]
 < intros M.

Subgoal 5.2.1.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields K
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
M : mem K [X]
============================
 exists I, mem (K, I) [(X, Hd)]
 < M: case M.

Subgoal 5.2.1.2.1:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 exists I, mem (X, I) [(X, Hd)]
 < search.

Subgoal 5.2.1.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields K
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
M : mem K []
============================
 exists I, mem (K, I) [(X, Hd)]
 < case M.

Subgoal 5.2.1.3:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 ctx_names EE_B Ctx
 < search.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < EvB: apply IH_S to _ _ _ _ _ _ BN ILA3 NNS.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < Ctxs': apply evalStmt_ctx_names to _ _ _ _ _ BN EvB.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Ctx' Hd Scope EE1 O2 Tl O3 Fields EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
Ctxs' : ctx_names EE_B' Ctx'
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply stmtNames_keep_older to _ _ BN.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields EE_B' Scope'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
Ctxs' : ctx_names EE_B' (Scope'::Ctx)
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < case Ctxs'.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < case IsEE1+.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < IsAR+: apply evalStmt_isCtx to _ _ _ EvB.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
IsAR+ : is_list (is_list (is_pair is_string is_value)) (A::ARest)
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < case IsAR+.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < NNS': apply evalStmt_newNameScopes to _ _ _ _ ILA3 EvB _.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : newNameScopes N Len (Scope::EE1) (A::ARest)
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < NNS': case NNS'.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < LenB: apply length_exists_list_pair_string_value to IsB.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < IsN2: apply length_is to LenB.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < P: apply plus_integer_total to _ IsN2 with
        N1 = 1.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < LenEE_B+: assert length ([(X, Hd)]::EE_B) N3.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd)]::EE_B) N3
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < LenAR+: apply evalStmt_keep_scopes to _ _ _ EvB LenEE_B+.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd)]::EE_B) N3
LenAR+ : length (A::ARest) N3
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply length_unique to LenAR+ NNS'.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenAR+ : length (A::ARest) Len
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < LEq: apply newNameScopes_length to NNS LenB.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenAR+ : length (A::ARest) Len
LEq : Len <= N2
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < L: apply lt_plus_one to P _.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd Scope EE1 O2 Tl O3 Fields Scope' ARest A N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : length (A::ARest) Len
NNS'1 : drop N1 (Scope::EE1) (A::ARest)
NNS'2 : take N1 (Scope::EE1) N
NNS'3 : names N SNames
NNS'4 : names (A::ARest) BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
LenB : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenAR+ : length (A::ARest) Len
LEq : Len <= N2
L : N2 < Len
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply less_lesseq_flip_false to L LEq.

Subgoal 5.2.3:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd EE1 O2 Tl O3 Fields Scope' ARest A
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (A::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) A
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : newNameScopes N Len EE1 ARest
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply IH_IL to _ _ _ _ _ _ _ _ BN ILA5 NNS'.

Subgoal 5.2.3:

Variables: FE EE_A EE_B X Body Ctx EE_A' O N Len Hd EE1 O2 Tl O3 Fields Scope' ARest A EE_B'1
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall FE EE_A EE_B V X Body Ctx EE_A' O N Len Ctx',
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
          iterateList FE EE_A V X Body EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'::Ctx)
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (A::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : ctx_names ([(X, Hd)]::EE_B) ([X]::Ctx)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (A::ARest) O2
H5 : forall X1, mem X1 [X] -> mem X1 Scope'
H6 : forall K I, mem (K, I) A -> mem K Scope'
H7 : forall K, mem K Scope' -> exists I, mem (K, I) A
H8 : ctx_names ARest Ctx
H9 : is_list (is_pair is_string is_value) A
H10 : is_list (is_list (is_pair is_string is_value)) EE1
H11 : is_list (is_pair is_string is_value) A
H12 : is_list (is_list (is_pair is_string is_value)) ARest
NNS' : newNameScopes N Len EE1 ARest
H13 : iterateList FE ARest Tl X Body EE_B'1 O3
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_scopes_same,
         exactEval:host:evalExpr_scopes_same_ctx,
         exactEval:host:evalStmt_scopes_same,
         exactEval:host:evalStmt_scopes_same_ctx,
         exactEval:host:evalArgs_scopes_same,
         exactEval:host:evalArgs_scopes_same_ctx,
         exactEval:host:evalRecFields_scopes_same,
         exactEval:host:evalRecFields_scopes_same_ctx
   with
      iterateList_scopes_same : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsA : is_list (is_list (is_pair is_string is_value)) EE_A ->
         IsB : is_list (is_list (is_pair is_string is_value)) EE_B ->
         SS : scopes_same EE_A EE_B ->
         ILA : iterateList FE EE_A V X Body EE_A' OA ->
         ILB : iterateList FE EE_B V X Body EE_B' OB ->
         OA = OB
      on ILA as IH_IL,
      iterateList_scopes_same_ctx : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsA : is_list (is_list (is_pair is_string is_value)) EE_A ->
         IsB : is_list (is_list (is_pair is_string is_value)) EE_B ->
         SS : scopes_same EE_A EE_B ->
         ILA : iterateList FE EE_A V X Body EE_A' OA ->
         ILB : iterateList FE EE_B V X Body EE_B' OB ->
         scopes_same EE_A' EE_B'
      on ILA as IH_IL_C.

Subgoal 1.27:

Variables: FE EE_A' EE_B VB EE_B' OB Ty
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A' EE_B
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
EvB : evalExpr FE EE_B (nil Ty) VB EE_B' OB
============================
 recVal [("null", trueVal)] = VB /\ [] = OB
 < case EvB.

Subgoal 1.27:

Variables: FE EE_A' EE_B' Ty
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
SS : scopes_same EE_A' EE_B'
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
============================
 recVal [("null", trueVal)] = recVal [("null", trueVal)] /\ [] = []
 < search.

Subgoal 1.28:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 V2 V1 E2 E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = VB /\ OA = OB
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 V2 V1 E2 E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 recVal [("null", falseVal), ("head", V1), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\
 OA = OB
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 1.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 V2 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\
 OA = OB
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 1.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 V2 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\
 OA = OB
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 1.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 V2 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\
 OA = OB
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 1.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 V2 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : scopes_same EE1 EE2
============================
 recVal [("null", falseVal), ("head", V3), ("tail", V2)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\
 OA = OB
 < apply IH_E to _ _ _ _ _ EvA2 EvB1.

Subgoal 1.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V4)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V4 EE_A' O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : scopes_same EE1 EE2
============================
 recVal [("null", falseVal), ("head", V3), ("tail", V4)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\
 OA = OB
 < apply append_unique to EvA3 EvB2.

Subgoal 1.28:

Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V3), ("tail", V4)]) EE_A' OB @
EvA1 : evalExpr FE EE_A E1 V3 EE1 O3 *
EvA2 : evalExpr FE EE1 E2 V4 EE_A' O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : scopes_same EE1 EE2
============================
 recVal [("null", falseVal), ("head", V3), ("tail", V4)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)] /\
 OB = OB
 < search.

Subgoal 1.29:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (head E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "head" VA
============================
 VA = VB /\ OA = OB
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (head E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
============================
 VA = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.29:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "head" VB
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 1.29:

Variables: FE EE_A VA EE_A' EE_B VB EE_B' OB E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' OB @
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB *
EvA2 : lookup Fields1 "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "head" VB
============================
 VA = VB /\ OB = OB
 < apply lookup_unique to EvA2 EvB1.

Subgoal 1.29:

Variables: FE EE_A EE_A' EE_B VB EE_B' OB E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VB EE_A' OB @
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB *
EvA2 : lookup Fields1 "head" VB
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "head" VB
============================
 VB = VB /\ OB = OB
 < search.

Subgoal 1.30:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "tail" VA
============================
 VA = VB /\ OA = OB
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
============================
 VA = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.30:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "tail" VB
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 1.30:

Variables: FE EE_A VA EE_A' EE_B VB EE_B' OB E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' OB @
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB *
EvA2 : lookup Fields1 "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "tail" VB
============================
 VA = VB /\ OB = OB
 < apply lookup_unique to EvA2 EvB1.

Subgoal 1.30:

Variables: FE EE_A EE_A' EE_B VB EE_B' OB E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VB EE_A' OB @
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB *
EvA2 : lookup Fields1 "tail" VB
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "tail" VB
============================
 VB = VB /\ OB = OB
 < search.

Subgoal 1.31:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (null E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "null" VA
============================
 VA = VB /\ OA = OB
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (null E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
============================
 VA = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.31:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "null" VB
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 1.31:

Variables: FE EE_A VA EE_A' EE_B VB EE_B' OB E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' OB @
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB *
EvA2 : lookup Fields1 "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "null" VB
============================
 VA = VB /\ OB = OB
 < apply lookup_unique to EvA2 EvB1.

Subgoal 1.31:

Variables: FE EE_A EE_A' EE_B VB EE_B' OB E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VB EE_A' OB @
EvA1 : evalExpr FE EE_A E1 (recVal Fields1) EE_A' OB *
EvA2 : lookup Fields1 "null" VB
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "null" VB
============================
 VB = VB /\ OB = OB
 < search.

Subgoal 1.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvB : evalExpr FE EE_B (index L I) VB EE_B' OB
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
============================
 VA = VB /\ OA = OB
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvB : evalExpr FE EE_B (index L I) VB EE_B' OB
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
============================
 VA = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 1.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
============================
 VA = VB /\ OA = OB
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 1.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 VA = VB /\ OA = OB
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 1.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 VA = VB /\ OA = OB
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 1.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : scopes_same EE1 EE2
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ _ EvA2 EvB1.

Subgoal 1.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O4 *
EvA3 : listIndex LV1 Idx1 VA
EvA4 : O3 ++ O4 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : scopes_same EE1 EE2
============================
 VA = VB /\ OA = OB
 < apply listIndex_unique to EvA3 EvB2.

Subgoal 1.32:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VB EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O4 *
EvA3 : listIndex LV1 Idx1 VB
EvA4 : O3 ++ O4 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : scopes_same EE1 EE2
============================
 VB = VB /\ OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 1.32:

Variables: FE EE_A EE_A' EE_B VB EE_B' OB EE1 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VB EE_A' OB @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : evalExpr FE EE1 I (intVal Idx1) EE_A' O4 *
EvA3 : listIndex LV1 Idx1 VB
EvA4 : O3 ++ O4 = OB
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE2
H5 : scopes_same EE1 EE2
============================
 VB = VB /\ OB = OB
 < search.

Subgoal 1.33:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V I E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 V EE_A' OA *
EvA2 : listLength V I
============================
 intVal I = VB /\ OA = OB
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V I E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 V EE_A' OA *
EvA2 : listLength V I
H1 : is_expr E1
============================
 intVal I = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.33:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB V I E1 V1 I1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V EE_A' OA *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' OB
EvB1 : listLength V1 I1
============================
 intVal I = intVal I1 /\ OA = OB
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 1.33:

Variables: FE EE_A EE_A' EE_B EE_B' OB I E1 V1 I1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OB @
EvA1 : evalExpr FE EE_A E1 V1 EE_A' OB *
EvA2 : listLength V1 I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' OB
EvB1 : listLength V1 I1
============================
 intVal I = intVal I1 /\ OB = OB
 < apply listLength_unique to EvA2 EvB1.

Subgoal 1.33:

Variables: FE EE_A EE_A' EE_B EE_B' OB E1 V1 I1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I1) EE_A' OB @
EvA1 : evalExpr FE EE_A E1 V1 EE_A' OB *
EvA2 : listLength V1 I1
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' OB
EvB1 : listLength V1 I1
============================
 intVal I1 = intVal I1 /\ OB = OB
 < search.

Subgoal 2.27:

Variables: FE EE_A' EE_B VB EE_B' OB Ty
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A' EE_B
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
EvB : evalExpr FE EE_B (nil Ty) VB EE_B' OB
============================
 scopes_same EE_A' EE_B'
 < case EvB.

Subgoal 2.27:

Variables: FE EE_A' EE_B' Ty
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
SS : scopes_same EE_A' EE_B'
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 2.28:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 V2 V1 E2 E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
============================
 scopes_same EE_A' EE_B'
 < case IsE.

Subgoal 2.28:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 V2 V1 E2 E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvB : evalExpr FE EE_B (cons E1 E2) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 2.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 2.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : scopes_same EE1 EE2
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 2.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : scopes_same EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 2.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : scopes_same EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA2 EvB1.

Subgoal 2.28:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O1 O2 V2 V1 E2 E1 EE2 O3 O4 V4 V3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O1 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 EE2 O3
EvB1 : evalExpr FE EE2 E2 V4 EE_B' O4
EvB2 : O3 ++ O4 = OB
H3 : scopes_same EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
H6 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 2.29:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (head E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "head" VA
============================
 scopes_same EE_A' EE_B'
 < case IsE.

Subgoal 2.29:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (head E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 2.29:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "head" VB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 2.29:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "head" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "head" VB
H2 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 2.30:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "tail" VA
============================
 scopes_same EE_A' EE_B'
 < case IsE.

Subgoal 2.30:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (tail E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 2.30:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "tail" VB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 2.30:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "tail" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "tail" VB
H2 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 2.31:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (null E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "null" VA
============================
 scopes_same EE_A' EE_B'
 < case IsE.

Subgoal 2.31:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @
EvB : evalExpr FE EE_B (null E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 2.31:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "null" VB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 2.31:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Fields E1 Fields1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' OA *
EvA2 : lookup Fields "null" VA
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (recVal Fields1) EE_B' OB
EvB1 : lookup Fields1 "null" VB
H2 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 2.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvB : evalExpr FE EE_B (index L I) VB EE_B' OB
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
============================
 scopes_same EE_A' EE_B'
 < case IsE.

Subgoal 2.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvB : evalExpr FE EE_B (index L I) VB EE_B' OB
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 2.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 2.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : scopes_same EE1 EE2
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 2.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : scopes_same EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 2.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : scopes_same EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA2 EvB1.

Subgoal 2.32:

Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB LV EE1 O1 Idx O2 I L LV1 EE2 O3 Idx1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) VA EE_A' OA @
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : evalExpr FE EE2 I (intVal Idx1) EE_B' O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
H3 : scopes_same EE1 EE2
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE2
H6 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 2.33:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V I E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 V EE_A' OA *
EvA2 : listLength V I
============================
 scopes_same EE_A' EE_B'
 < case IsE.

Subgoal 2.33:

Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB V I E1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @
EvB : evalExpr FE EE_B (exactEval:list:length E1) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 V EE_A' OA *
EvA2 : listLength V I
H1 : is_expr E1
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 2.33:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB V I E1 V1 I1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V EE_A' OA *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' OB
EvB1 : listLength V1 I1
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 2.33:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB V I E1 V1 I1
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' OA @
EvA1 : evalExpr FE EE_A E1 V EE_A' OA *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 EE_B' OB
EvB1 : listLength V1 I1
H2 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvB : evalStmt FE EE_B (listUpdate L I E) EE_B' OB
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsS.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvB : evalStmt FE EE_B (listUpdate L I E) EE_B' OB
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 OA = OB
 < EvB: case EvB.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 OA = OB
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 OA = OB
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : scopes_same EE1 EE3
============================
 OA = OB
 < apply IH_E_C to _ _ _ _ _ EvA2 EvB1.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : scopes_same EE1 EE3
H7 : scopes_same EE2 EE4
============================
 OA = OB
 < apply evalExpr_isCtx to _ _ _ EvA2.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : scopes_same EE1 EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OA = OB
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : scopes_same EE1 EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 OA = OB
 < apply scopes_same_lookupScopes to _ _ _ EvA3 EvB2.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV1
EvA4 : updateListIndex LV1 N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : scopes_same EE1 EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ EvA2 EvB1.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V1 EE2 O4 *
EvA3 : lookupScopes L EE2 LV1
EvA4 : updateListIndex LV1 N1 V1 LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : scopes_same EE1 EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 OA = OB
 < apply append_unique to EvA6 EvB5.

Subgoal 3.15:

Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 EE2 LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OB @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V1 EE2 O4 *
EvA3 : lookupScopes L EE2 LV1
EvA4 : updateListIndex LV1 N1 V1 LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : scopes_same EE1 EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 OB = OB
 < search.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvB : evalStmt FE EE_B (listForeach X L Body) EE_B' OB
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsS.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvB : evalStmt FE EE_B (listForeach X L Body) EE_B' OB
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 OA = OB
 < EvB: case EvB.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
============================
 OA = OB
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
============================
 OA = OB
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
H6 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 OA = OB
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
H6 : is_list (is_list (is_pair is_string is_value)) EE1
H7 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OA = OB
 < apply IH_IL to _ _ _ _ _ _ _ EvA2 EvB1.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
H6 : is_list (is_list (is_pair is_string is_value)) EE1
H7 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OA = OB
 < apply append_unique to EvA3 EvB2.

Subgoal 3.16:

Variables: FE EE_A EE_A' EE_B EE_B' OB EE1 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OB @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
H6 : is_list (is_list (is_pair is_string is_value)) EE1
H7 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OB = OB
 < search.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvB : evalStmt FE EE_B (listUpdate L I E) EE_B' OB
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
============================
 scopes_same EE_A' EE_B'
 < case IsS.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvB : evalStmt FE EE_B (listUpdate L I E) EE_B' OB
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA2 EvB1.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB N EE1 O1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O1 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : scopes_same EE2 EE4
============================
 scopes_same EE_A' EE_B'
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 V EE2 O2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V EE2 O2 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : scopes_same EE2 EE4
============================
 scopes_same EE_A' EE_B'
 < apply IH_E to _ _ _ _ _ EvA2 EvB1.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V1 EE2 O4 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V1 LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : scopes_same EE2 EE4
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA2.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V1 EE2 O4 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V1 LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V1 EE2 O4 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N1 V1 LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 scopes_same EE_A' EE_B'
 < apply scopes_same_lookupScopes to _ _ _ EvA3 EvB2.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 LV2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V1 EE2 O4 *
EvA3 : lookupScopes L EE2 LV1
EvA4 : updateListIndex LV1 N1 V1 LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 scopes_same EE_A' EE_B'
 < apply updateListIndex_unique to EvA4 EvB3.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V1 EE2 O4 *
EvA3 : lookupScopes L EE2 LV1
EvA4 : updateListIndex LV1 N1 V1 LV3
EvA5 : replaceScopes L LV3 EE2 EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 scopes_same EE_A' EE_B'
 < apply scopes_same_replaceScopes_scopes_same to _ _ _ _ EvA5 EvB4.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 EE2 E I L N1 EE3 O3 V1 EE4 O4 LV1 LV3
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' OA @
EvA1 : evalExpr FE EE_A I (intVal N1) EE1 O3 *
EvA2 : evalExpr FE EE1 E V1 EE2 O4 *
EvA3 : lookupScopes L EE2 LV1
EvA4 : updateListIndex LV1 N1 V1 LV3
EvA5 : replaceScopes L LV3 EE2 EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : evalExpr FE EE_B I (intVal N1) EE3 O3
EvB1 : evalExpr FE EE3 E V1 EE4 O4
EvB2 : lookupScopes L EE4 LV1
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE4 EE_B'
EvB5 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE3
H5 : is_list (is_list (is_pair is_string is_value)) EE1
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : scopes_same EE2 EE4
H8 : is_list (is_list (is_pair is_string is_value)) EE2
H9 : is_list (is_list (is_pair is_string is_value)) EE4
H10 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvB : evalStmt FE EE_B (listForeach X L Body) EE_B' OB
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = OA
============================
 scopes_same EE_A' EE_B'
 < case IsS.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvB : evalStmt FE EE_B (listForeach X L Body) EE_B' OB
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV EE1 O1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV EE1 O1 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
H6 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
H6 : is_list (is_list (is_pair is_string is_value)) EE1
H7 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 scopes_same EE_A' EE_B'
 < apply IH_IL_C to _ _ _ _ _ _ _ EvA2 EvB1.

Subgoal 4.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB EE1 O2 Body L X LV1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' OA @
EvA1 : evalExpr FE EE_A L LV1 EE1 O3 *
EvA2 : iterateList FE EE1 LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV1 EE2 O3
EvB1 : iterateList FE EE2 LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : scopes_same EE1 EE2
H5 : is_value LV1
H6 : is_list (is_list (is_pair is_string is_value)) EE1
H7 : is_list (is_list (is_pair is_string is_value)) EE2
H8 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 9.1:

Variables: X Body FE EE_A' EE_B EE_B' OB Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A' EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB
ILA1 : lookup Fields "null" trueVal
============================
 [] = OB
 < ILB: case ILB.

Subgoal 9.1.1:

Variables: X Body FE EE_A' EE_B' Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
SS : scopes_same EE_A' EE_B'
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILA1 : lookup Fields "null" trueVal
ILB : lookup Fields "null" trueVal
============================
 [] = []
 < search.

Subgoal 9.1.2:

Variables: X Body FE EE_A' EE_B EE_B' OB Fields Hd Scope EE1 O1 Tl O2
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A' EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILA1 : lookup Fields "null" trueVal
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O1
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE1 Tl X Body EE_B' O2
ILB5 : O1 ++ O2 = OB
============================
 [] = OB
 < apply lookup_unique to ILA1 ILB.

Subgoal 9.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsV.

Subgoal 9.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
============================
 OA = OB
 < ILB: case ILB.

Subgoal 9.2.1:

Variables: X Body FE EE_A EE_A' OA EE_B' Hd Scope EE1 O1 Tl O2 Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
SS : scopes_same EE_A EE_B'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" trueVal
============================
 OA = []
 < apply lookup_unique to ILA1 ILB.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply lookup_unique to ILB1 ILA2.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 Tl1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply lookup_unique to ILB3 ILA4.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply lookup_is_value to _ ILB1.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
============================
 OA = OB
 < apply lookup_is_value to _ ILB3.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
============================
 OA = OB
 < apply IH_S to _ _ _ _ _ ILA3 ILB2.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
============================
 OA = OB
 < SS': apply IH_S_C to _ _ _ _ _ ILA3 ILB2.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same (Scope::EE1) (Scope1::EE2)
============================
 OA = OB
 < case SS'.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
============================
 OA = OB
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 OA = OB
 < case IsEE1+.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 OA = OB
 < IsEE2+: apply evalStmt_isCtx to _ _ _ ILB2.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2)
============================
 OA = OB
 < case IsEE2+.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O3 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
H9 : is_list (is_pair is_string is_value) Scope1
H10 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OA = OB
 < apply IH_IL to _ _ _ _ _ _ _ ILA5 ILB4.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 Tl Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O4 *
ILA6 : O3 ++ O4 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
H9 : is_list (is_pair is_string is_value) Scope1
H10 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OA = OB
 < apply append_unique to ILA6 ILB5.

Subgoal 9.2.2:

Variables: X Body FE EE_A EE_A' EE_B EE_B' OB Hd Scope EE1 Tl Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OB @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O4 *
ILA6 : O3 ++ O4 = OB
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
H9 : is_list (is_pair is_string is_value) Scope1
H10 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OB = OB
 < search.

Subgoal 10.1:

Variables: X Body FE EE_A' EE_B EE_B' OB Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A' EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB
ILA1 : lookup Fields "null" trueVal
============================
 scopes_same EE_A' EE_B'
 < ILB: case ILB.

Subgoal 10.1.1:

Variables: X Body FE EE_A' EE_B' Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
SS : scopes_same EE_A' EE_B'
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILA1 : lookup Fields "null" trueVal
ILB : lookup Fields "null" trueVal
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 10.1.2:

Variables: X Body FE EE_A' EE_B EE_B' OB Fields Hd Scope EE1 O1 Tl O2
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A' EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILA1 : lookup Fields "null" trueVal
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O1
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE1 Tl X Body EE_B' O2
ILB5 : O1 ++ O2 = OB
============================
 scopes_same EE_A' EE_B'
 < apply lookup_unique to ILA1 ILB.

Subgoal 10.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
============================
 scopes_same EE_A' EE_B'
 < case IsV.

Subgoal 10.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILB : iterateList FE EE_B (recVal Fields) X Body EE_B' OB
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
============================
 scopes_same EE_A' EE_B'
 < ILB: case ILB.

Subgoal 10.2.1:

Variables: X Body FE EE_A EE_A' OA EE_B' Hd Scope EE1 O1 Tl O2 Fields
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B'
SS : scopes_same EE_A EE_B'
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" trueVal
============================
 scopes_same EE_A' EE_B'
 < apply lookup_unique to ILA1 ILB.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Hd1 Scope1 EE2 O3 Tl1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd1
ILB2 : evalStmt FE ([(X, Hd1)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply lookup_unique to ILB1 ILA2.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 Tl1 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl1
ILB4 : iterateList FE EE2 Tl1 X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply lookup_unique to ILB3 ILA4.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply lookup_is_value to _ ILB1.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
============================
 scopes_same EE_A' EE_B'
 < apply lookup_is_value to _ ILB3.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
============================
 scopes_same EE_A' EE_B'
 < SS': apply IH_S_C to _ _ _ _ _ ILA3 ILB2.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same (Scope::EE1) (Scope1::EE2)
============================
 scopes_same EE_A' EE_B'
 < case SS'.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
============================
 scopes_same EE_A' EE_B'
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 scopes_same EE_A' EE_B'
 < case IsEE1+.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 scopes_same EE_A' EE_B'
 < IsEE2+: apply evalStmt_isCtx to _ _ _ ILB2.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2)
============================
 scopes_same EE_A' EE_B'
 < case IsEE2+.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
H9 : is_list (is_pair is_string is_value) Scope1
H10 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 scopes_same EE_A' EE_B'
 < apply IH_IL_C to _ _ _ _ _ _ _ ILA5 ILB4.

Subgoal 10.2.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Hd Scope EE1 O1 Tl O2 Fields Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IH_IL : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
          OA = OB
IH_IL_C : forall V X Body FE EE_A EE_A' OA EE_B EE_B' OB,
            is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' OA * -> iterateList FE EE_B V X Body EE_B' OB ->
            scopes_same EE_A' EE_B'
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' OA @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA6 : O1 ++ O2 = OA
H1 : is_list (is_pair is_string is_value) Fields
ILB : lookup Fields "null" falseVal
ILB1 : lookup Fields "head" Hd
ILB2 : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB3 : lookup Fields "tail" Tl
ILB4 : iterateList FE EE2 Tl X Body EE_B' O4
ILB5 : O3 ++ O4 = OB
H2 : is_value Hd
H3 : is_value Tl
H4 : forall X V, lookup Scope X V -> lookup Scope1 X V
H5 : forall X V, lookup Scope1 X V -> lookup Scope X V
H6 : scopes_same EE1 EE2
H7 : is_list (is_pair is_string is_value) Scope
H8 : is_list (is_list (is_pair is_string is_value)) EE1
H9 : is_list (is_pair is_string is_value) Scope1
H10 : is_list (is_list (is_pair is_string is_value)) EE2
H11 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_scopes_same_exists,
         exactEval:host:evalStmt_scopes_same_exists,
         exactEval:host:evalArgs_scopes_same_exists,
         exactEval:host:evalRecFields_scopes_same_exists
   with
      iterateList_scopes_same_exists : forall V X Body FE EE_A EE_A' O EE_B,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsA : is_list (is_list (is_pair is_string is_value)) EE_A ->
         IsB : is_list (is_list (is_pair is_string is_value)) EE_B ->
         SS : scopes_same EE_A EE_B ->
         ILA : iterateList FE EE_A V X Body EE_A' O ->
         exists EE_B',
           iterateList FE EE_B V X Body EE_B' O
      on ILA as IH_IL.

Subgoal 1.27:

Variables: FE EE_A' EE_B Ty
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A' EE_B
EvA : evalExpr FE EE_A' (nil Ty) (recVal [("null", trueVal)]) EE_A' [] @
============================
 exists EE_B', evalExpr FE EE_B (nil Ty) (recVal [("null", trueVal)]) EE_B' []
 < search.

Subgoal 1.28:

Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < EvB1: apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.28:

Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1.

Subgoal 1.28:

Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
SS' : scopes_same EE1 EE_B'
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 1.28:

Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
SS' : scopes_same EE1 EE_B'
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 1.28:

Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
SS' : scopes_same EE1 EE_B'
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < EvB2: apply IH_E to _ _ _ _ SS' EvA2.

Subgoal 1.28:

Variables: FE EE_A EE_A' O EE_B EE1 O2 O3 V2 V1 E2 E1 EE_B' EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE1 O2 *
EvA2 : evalExpr FE EE1 E2 V2 EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O2
SS' : scopes_same EE1 EE_B'
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB2 : evalExpr FE EE_B' E2 V2 EE_B'1 O3
============================
 exists EE_B',
   evalExpr FE EE_B (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE_B' O
 < search.

Subgoal 1.29:

Variables: FE EE_A V EE_A' O EE_B Fields E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "head" V
============================
 exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A V EE_A' O EE_B Fields E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "head" V
H1 : is_expr E1
============================
 exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
 < EvB1: apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.29:

Variables: FE EE_A V EE_A' O EE_B Fields E1 EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (head E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "head" V
H1 : is_expr E1
EvB1 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O
============================
 exists EE_B', evalExpr FE EE_B (head E1) V EE_B' O
 < search.

Subgoal 1.30:

Variables: FE EE_A V EE_A' O EE_B Fields E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "tail" V
============================
 exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A V EE_A' O EE_B Fields E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
 < EvB1: apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.30:

Variables: FE EE_A V EE_A' O EE_B Fields E1 EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (tail E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "tail" V
H1 : is_expr E1
EvB1 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O
============================
 exists EE_B', evalExpr FE EE_B (tail E1) V EE_B' O
 < search.

Subgoal 1.31:

Variables: FE EE_A V EE_A' O EE_B Fields E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "null" V
============================
 exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A V EE_A' O EE_B Fields E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "null" V
H1 : is_expr E1
============================
 exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
 < EvB1: apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.31:

Variables: FE EE_A V EE_A' O EE_B Fields E1 EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (null E1) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 (recVal Fields) EE_A' O *
EvA2 : lookup Fields "null" V
H1 : is_expr E1
EvB1 : evalExpr FE EE_B E1 (recVal Fields) EE_B' O
============================
 exists EE_B', evalExpr FE EE_B (null E1) V EE_B' O
 < search.

Subgoal 1.32:

Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < EvB1: apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.32:

Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvB1 : evalExpr FE EE_B L LV EE_B' O2
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1.

Subgoal 1.32:

Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvB1 : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 1.32:

Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvB1 : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 1.32:

Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvB1 : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < EvB2: apply IH_E to _ _ _ _ SS' EvA2.

Subgoal 1.32:

Variables: FE EE_A V EE_A' O EE_B LV EE1 O2 Idx O3 I L EE_B' EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (index L I) V EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : evalExpr FE EE1 I (intVal Idx) EE_A' O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
EvB1 : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
H3 : is_list (is_list (is_pair is_string is_value)) EE1
H4 : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB2 : evalExpr FE EE_B' I (intVal Idx) EE_B'1 O3
============================
 exists EE_B', evalExpr FE EE_B (index L I) V EE_B' O
 < search.

Subgoal 1.33:

Variables: FE EE_A EE_A' O EE_B V1 I E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O *
EvA2 : listLength V1 I
============================
 exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A EE_A' O EE_B V1 I E1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O *
EvA2 : listLength V1 I
H1 : is_expr E1
============================
 exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
 < EvB1: apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.33:

Variables: FE EE_A EE_A' O EE_B V1 I E1 EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalExpr FE EE_A (exactEval:list:length E1) (intVal I) EE_A' O @
EvA1 : evalExpr FE EE_A E1 V1 EE_A' O *
EvA2 : listLength V1 I
H1 : is_expr E1
EvB1 : evalExpr FE EE_B E1 V1 EE_B' O
============================
 exists EE_B', evalExpr FE EE_B (exactEval:list:length E1) (intVal I) EE_B' O
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < EvB1: apply IH_E to _ _ _ _ SS EvA1.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB1.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < EvB2: apply IH_E to _ _ _ _ SS' EvA2.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA2.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB2.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_list (is_list (is_pair is_string is_value)) EE_B'1
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < SS'': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA2 EvB2.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_list (is_list (is_pair is_string is_value)) EE_B'1
SS'' : scopes_same EE2 EE_B'1
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < apply scopes_same_lookupScopes_exists to _ _ SS'' EvA3.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_list (is_list (is_pair is_string is_value)) EE_B'1
SS'' : scopes_same EE2 EE_B'1
H8 : lookupScopes L EE_B'1 LV
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < apply scopes_same_replaceScopes_exists to _ _ _ SS'' EvA5.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B N EE1 O2 V EE2 O3 LV LV2 E I L EE_B' EE_B'1 B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listUpdate L I E) EE_A' O @
EvA1 : evalExpr FE EE_A I (intVal N) EE1 O2 *
EvA2 : evalExpr FE EE1 E V EE2 O3 *
EvA3 : lookupScopes L EE2 LV
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE2 EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB1 : evalExpr FE EE_B I (intVal N) EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
EvB2 : evalExpr FE EE_B' E V EE_B'1 O3
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : is_list (is_list (is_pair is_string is_value)) EE_B'1
SS'' : scopes_same EE2 EE_B'1
H8 : lookupScopes L EE_B'1 LV
H9 : replaceScopes L LV2 EE_B'1 B'
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < search.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
============================
 exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
 < case IsS.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
 < EvB: apply IH_E to _ _ _ _ SS EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV EE_B' O2
============================
 exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
 < SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
============================
 exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
 < apply evalExpr_isCtx to _ _ _ EvB.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
H6 : is_value LV
============================
 exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
 < apply IH_IL to _ _ _ _ _ _ SS' EvA2.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV EE1 O2 O3 Body L X EE_B' EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (listForeach X L Body) EE_A' O @
EvA1 : evalExpr FE EE_A L LV EE1 O2 *
EvA2 : iterateList FE EE1 LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
EvB : evalExpr FE EE_B L LV EE_B' O2
SS' : scopes_same EE1 EE_B'
H4 : is_list (is_list (is_pair is_string is_value)) EE1
H5 : is_list (is_list (is_pair is_string is_value)) EE_B'
H6 : is_value LV
H7 : iterateList FE EE_B' LV X Body EE_B'1 O3
============================
 exists EE_B', evalStmt FE EE_B (listForeach X L Body) EE_B' O
 < search.

Subgoal 5.1:

Variables: X Body FE EE_A' EE_B Fields
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A'
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A' EE_B
ILA : iterateList FE EE_A' (recVal Fields) X Body EE_A' [] @
ILA1 : lookup Fields "null" trueVal
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' []
 < search.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < case IsV.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply lookup_is_value to _ ILA2.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply lookup_is_value to _ ILA4.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < SS': assert scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B).

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < EvB: apply IH_S to _ _ _ _ SS' ILA3.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA3.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < case IsEE1+.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < IsB+: apply evalStmt_isCtx to _ _ _ EvB.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE1
IsB+ : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < SS+: apply evalStmt_scopes_same_ctx to _ _ _ _ _ ILA3 EvB.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE1
IsB+ : is_list (is_list (is_pair is_string is_value)) EE_B'
SS+ : scopes_same (Scope::EE1) EE_B'
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < SS'': case SS+.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields BRest B
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE1
IsB+ : is_list (is_list (is_pair is_string is_value)) (B::BRest)
SS'' : forall X V, lookup Scope X V -> lookup B X V
SS''1 : forall X V, lookup B X V -> lookup Scope X V
SS''2 : scopes_same EE1 BRest
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < case IsB+.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields BRest B
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE1
SS'' : forall X V, lookup Scope X V -> lookup B X V
SS''1 : forall X V, lookup B X V -> lookup Scope X V
SS''2 : scopes_same EE1 BRest
H6 : is_list (is_pair is_string is_value) B
H7 : is_list (is_list (is_pair is_string is_value)) BRest
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < apply IH_IL to _ _ _ _ _ _ SS''2 ILA5.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Hd Scope EE1 O2 Tl O3 Fields BRest B EE_B'1
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IH_IL : forall V X Body FE EE_A EE_A' O EE_B,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> iterateList FE EE_A V X Body EE_A' O * -> exists EE_B',
            iterateList FE EE_B V X Body EE_B' O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
ILA : iterateList FE EE_A (recVal Fields) X Body EE_A' O @
ILA1 : lookup Fields "null" falseVal
ILA2 : lookup Fields "head" Hd
ILA3 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA4 : lookup Fields "tail" Tl
ILA5 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
SS' : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE1
SS'' : forall X V, lookup Scope X V -> lookup B X V
SS''1 : forall X V, lookup B X V -> lookup Scope X V
SS''2 : scopes_same EE1 BRest
H6 : is_list (is_pair is_string is_value) B
H7 : is_list (is_list (is_pair is_string is_value)) BRest
H8 : iterateList FE BRest Tl X Body EE_B'1 O3
============================
 exists EE_B', iterateList FE EE_B (recVal Fields) X Body EE_B' O
 < search.

Proof completed.
 < Theorem is_list_values_append_nil :
     forall L, is_list is_value L -> L ++ [] = L.

============================
 forall L, is_list is_value L -> L ++ [] = L
 < induction on 1.

IH : forall L, is_list is_value L * -> L ++ [] = L
============================
 forall L, is_list is_value L @ -> L ++ [] = L
 < intros IsL.

Variables: L
IH : forall L, is_list is_value L * -> L ++ [] = L
IsL : is_list is_value L @
============================
 L ++ [] = L
 < Is: case IsL.

Subgoal 1:

IH : forall L, is_list is_value L * -> L ++ [] = L
============================
 [] ++ [] = []
 < search.

Subgoal 2:

Variables: T H
IH : forall L, is_list is_value L * -> L ++ [] = L
Is : is_value H
Is1 : is_list is_value T *
============================
 H::T ++ [] = H::T
 < apply IH to Is1.

Subgoal 2:

Variables: T H
IH : forall L, is_list is_value L * -> L ++ [] = L
Is : is_value H
Is1 : is_list is_value T *
H1 : T ++ [] = T
============================
 H::T ++ [] = H::T
 < search.

Proof completed.
 < Theorem index_to_while :
     forall LV IV V FE Ctx I L,
       listIndex LV IV V -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V.

============================
 forall LV IV V FE Ctx I L,
   listIndex LV IV V -> (L = I -> false) -> is_integer IV -> exists Fields,
     <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
     lookup Fields "head" V
 < induction on 1.

IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
============================
 forall LV IV V FE Ctx I L,
   listIndex LV IV V @ -> (L = I -> false) -> is_integer IV -> exists Fields,
     <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
     lookup Fields "head" V
 < intros LI NEqLI IsIV.

Variables: LV IV V FE Ctx I L
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
LI : listIndex LV IV V @
NEqLI : L = I -> false
IsIV : is_integer IV
============================
 exists Fields,
   <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
   lookup Fields "head" V
 < LI: case LI.

Subgoal 1:

Variables: V FE Ctx I L Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer 0
LI : lookup Fields "head" V
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "head" V
 < exists Fields.

Subgoal 1:

Variables: V FE Ctx I L Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer 0
LI : lookup Fields "head" V
============================
 <evalStmt {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
 lookup Fields "head" V
 < split.

Subgoal 1.1:

Variables: V FE Ctx I L Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer 0
LI : lookup Fields "head" V
============================
 <evalStmt {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0
 < assert <evalExpr {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) falseVal ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0.

Subgoal 1.1:

Variables: V FE Ctx I L Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer 0
LI : lookup Fields "head" V
H1 : <evalExpr {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) falseVal ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0
============================
 <evalStmt {ES}> FE ([(I, intVal 0), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0
 < search.

Subgoal 1.2:

Variables: V FE Ctx I L Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer 0
LI : lookup Fields "head" V
============================
 lookup Fields "head" V
 < search.

Subgoal 2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "head" V
 < apply minus_integer_is_integer to _ _ LI.

Subgoal 2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "head" V
 < NEqIL: assert I = L -> false.

Subgoal 2.1:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
============================
 I = L -> false
 < intros E.

Subgoal 2.1:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
E : I = L
============================
 false
 < case E.

Subgoal 2.1:

Variables: IV V FE Ctx L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = L -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
============================
 false
 < backchain NEqLI.

Subgoal 2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "head" V
 < assert <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0.

Subgoal 2.2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
 < unfold .

Subgoal 2.2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 exists N2 N1 I1 EE1 O1 I2 O2,
   N2 + N1 = 0 /\
   (<evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (name I) (intVal I1) EE1 O1 N2 /\
   (<evalExpr {ES}> FE EE1 (num 0) (intVal I2) ([(I, intVal IV), (L, recVal Fields)]::Ctx) O2 N1 /\
   (I1 > I2 /\ O1 ++ O2 = [])))
 < exists 0,
   0,
   IV,
   [(I, intVal IV), (L, recVal Fields)]::Ctx,
   [],
   0,
   [].

Subgoal 2.2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 0 + 0 = 0 /\
 (<evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (name I) (intVal IV) ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 /\
 (<evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (num 0) (intVal 0) ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0 /\
 (IV > 0 /\ [] ++ [] = [])))
 < split.

Subgoal 2.2.1:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 0 + 0 = 0
 < search.

Subgoal 2.2.2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (name I) (intVal IV) ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
 < search.

Subgoal 2.2.3:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (num 0) (intVal 0) ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
 < search.

Subgoal 2.2.4:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 IV > 0
 < GEq: apply listIndex_geq_0 to _ LI2.

Subgoal 2.2.4:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
GEq : I1 >= 0
============================
 IV > 0
 < P: apply minus_plus_same_integer to _ _ LI.

Subgoal 2.2.4:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
GEq : I1 >= 0
P : I1 + 1 = IV
============================
 IV > 0
 < P': apply plus_integer_comm to _ _ P.

Subgoal 2.2.4:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
GEq : I1 >= 0
P : I1 + 1 = IV
P' : 1 + I1 = IV
============================
 IV > 0
 < L: apply lt_plus_one to P' _.

Subgoal 2.2.4:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
GEq : I1 >= 0
P : I1 + 1 = IV
P' : 1 + I1 = IV
L : I1 < IV
============================
 IV > 0
 < LEq: case GEq.

Subgoal 2.2.4:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
P : I1 + 1 = IV
P' : 1 + I1 = IV
L : I1 < IV
LEq : 0 <= I1
============================
 IV > 0
 < apply lesseq_less_integer_transitive to LEq L.

Subgoal 2.2.4:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
P : I1 + 1 = IV
P' : 1 + I1 = IV
L : I1 < IV
LEq : 0 <= I1
H2 : 0 < IV
============================
 IV > 0
 < search.

Subgoal 2.2.5:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
============================
 [] ++ [] = []
 < search.

Subgoal 2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "head" V
 < assert <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0.

Subgoal 2.3:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
============================
 <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0
 < search 20.

Subgoal 2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
H3 : <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "head" V
 < assert <evalStmt {ES}> FE ([]::([(L, Tl), (I, intVal IV)]::Ctx)) (assign I (minus (name I) (num 1))) ([]::([(I, intVal I1), (L, Tl)]::Ctx)) [] 0.

Subgoal 2.4:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
H3 : <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0
============================
 <evalStmt {ES}> FE ([]::([(L, Tl), (I, intVal IV)]::Ctx)) (assign I (minus (name I) (num 1))) ([]::([(I, intVal I1), (L, Tl)]::Ctx)) [] 0
 < search 20.

Subgoal 2:

Variables: IV V FE Ctx I L I1 Tl Fields
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
H3 : <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0
H4 : <evalStmt {ES}> FE ([]::([(L, Tl), (I, intVal IV)]::Ctx)) (assign I (minus (name I) (num 1))) ([]::([(I, intVal I1), (L, Tl)]::Ctx)) [] 0
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "head" V
 < apply IH to LI2 _ _ with
     Ctx = Ctx FE = FE.

Subgoal 2:

Variables: IV V FE Ctx I L I1 Tl Fields Fields1
IH : forall LV IV V FE Ctx I L,
       listIndex LV IV V * -> (L = I -> false) -> is_integer IV -> exists Fields,
         <evalStmt {ES}> FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "head" V
NEqLI : L = I -> false
IsIV : is_integer IV
LI : IV - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
H1 : is_integer I1
NEqIL : I = L -> false
H2 : <evalExpr {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (greater (name I) (num 0)) trueVal ([(I, intVal IV), (L, recVal Fields)]::Ctx) [] 0
H3 : <evalStmt {ES}> FE ([]::([(I, intVal IV), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (I, intVal IV)]::Ctx)) [] 0
H4 : <evalStmt {ES}> FE ([]::([(L, Tl), (I, intVal IV)]::Ctx)) (assign I (minus (name I) (num 1))) ([]::([(I, intVal I1), (L, Tl)]::Ctx)) [] 0
H5 : <evalStmt {ES}> FE ([(I, intVal I1), (L, Tl)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0
H6 : lookup Fields1 "head" V
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(I, intVal IV), (L, recVal Fields)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) ([(I, intVal 0), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "head" V
 < search.

Proof completed.
 < Theorem while_to_index :
     forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx).

============================
 forall LV IV V FE Ctx Ctx' O I L Fields,
   evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O ->
   lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV ->
   (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
   (exists Scope, Ctx' = Scope::Ctx)
 < induction on 1.

IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
============================
 forall LV IV V FE Ctx Ctx' O I L Fields,
   evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @ ->
   lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 -> is_integer IV ->
   (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
   (exists Scope, Ctx' = Scope::Ctx)
 < intros Ev LkpL LkpHead GEqIV IsIV NEqLI.

Variables: LV IV V FE Ctx Ctx' O I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
Ev : evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < NEqIL: assert I = L -> false.

Subgoal 1:

Variables: LV IV V FE Ctx Ctx' O I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
Ev : evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
============================
 I = L -> false
 < intros E.

Subgoal 1:

Variables: LV IV V FE Ctx Ctx' O I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
Ev : evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
E : I = L
============================
 false
 < case E.

Subgoal 1:

Variables: LV IV V FE Ctx Ctx' O L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
Ev : evalStmt FE ([(L, intVal IV), (L, LV)]::Ctx) (while (greater (name L) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign L (minus (name L) (num 1))))) Ctx' O @
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = L -> false
============================
 false
 < backchain NEqLI.

Variables: LV IV V FE Ctx Ctx' O I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
Ev : evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O @
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 *
Ev1 : evalStmt FE ([]::EE1) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1)))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev1.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O1 O5
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 *
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev1 : evalStmt FE ([]::EE1) (assign L (recFieldAccess (name L) "tail")) EE3 O1 *
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 *
Ev6 : O1 ++ O5 = O3
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev1.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O1 O5 V1 EE4
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 *
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 *
Ev6 : O1 ++ O5 = O3
Ev1 : evalExpr FE ([]::EE1) (recFieldAccess (name L) "tail") V1 EE4 O1 *
Ev7 : replaceScopes L V1 EE4 EE3
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev1.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O1 O5 V1 EE4 Fields1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 *
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 *
Ev6 : O1 ++ O5 = O3
Ev7 : replaceScopes L V1 EE4 EE3
Ev1 : evalExpr FE ([]::EE1) (name L) (recVal Fields1) EE4 O1 *
Ev8 : lookup Fields1 "tail" V1
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev1.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) trueVal EE1 O2 *
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 *
Ev6 : [] ++ O5 = O3
Ev7 : replaceScopes L V1 ([]::EE1) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::EE1) (recVal Fields1)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 I1 EE5 O6 I2 O7
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 *
Ev6 : [] ++ O5 = O3
Ev7 : replaceScopes L V1 ([]::EE1) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::EE1) (recVal Fields1)
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (name I) (intVal I1) EE5 O6 *
Ev9 : evalExpr FE EE5 (num 0) (intVal I2) EE1 O7 *
Ev10 : I1 > I2
Ev11 : O6 ++ O7 = O2
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Ev9.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields EE1 O2 Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 I1 O6
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 *
Ev6 : [] ++ O5 = O3
Ev7 : replaceScopes L V1 ([]::EE1) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::EE1) (recVal Fields1)
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (name I) (intVal I1) EE1 O6 *
Ev10 : I1 > 0
Ev11 : O6 ++ [] = O2
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields O2 Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 *
Ev6 : [] ++ O5 = O3
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev11 : [] ++ [] = O2
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Ev11.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O3 O4 O12 EE3 O5 V1 Fields1 I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O5 *
Ev6 : [] ++ O5 = O3
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Ev6.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O3 O4 O12 EE3 V1 Fields1 I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O3 *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Ev3.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 EE3 V1 Fields1 I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : evalStmt FE EE3 (assign I (minus (name I) (num 1))) (Scope::EE2) O12 *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev5.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 EE3 V1 Fields1 I1 V2 EE6
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Ev3 : evalExpr FE EE3 (minus (name I) (num 1)) V2 EE6 O12 *
Ev5 : replaceScopes I V2 EE6 (Scope::EE2)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev3.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 EE3 V1 Fields1 I1 EE6 I4 EE7 O8 I5 O9 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev3 : evalExpr FE EE3 (name I) (intVal I4) EE7 O8 *
Ev6 : evalExpr FE EE7 (num 1) (intVal I5) EE6 O9 *
Ev9 : I4 - I5 = I3
Ev11 : O8 ++ O9 = O12
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Ev6.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 EE3 V1 Fields1 I1 EE6 I4 O8 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE3
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev3 : evalExpr FE EE3 (name I) (intVal I4) EE6 O8 *
Ev9 : I4 - 1 = I3
Ev11 : O8 ++ [] = O12
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev3.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 O12 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev11 : [] ++ [] = O12
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Ev11.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 O4 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O4 *
Ev4 : [] ++ O4 = O
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Ev4.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Eq: assert I1 = IV.

Subgoal 2.1:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 I1 = IV
 < LS: case Ev.

Subgoal 2.1.1:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS : lookup [(I, intVal IV), (L, LV)] I (intVal I1)
============================
 I1 = IV
 < L: case LS.

Subgoal 2.1.1.1:

Variables: LV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : I1 >= 0
IsIV : is_integer I1
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal I1), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal I1), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 I1 = I1
 < search.

Subgoal 2.1.1.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
L : I = I -> false
L1 : lookup [(L, LV)] I (intVal I1)
============================
 I1 = IV
 < apply L to _.

Subgoal 2.1.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS : no_lookup [(I, intVal IV), (L, LV)] I
LS1 : lookupScopes I Ctx (intVal I1)
============================
 I1 = IV
 < NL: case LS.

Subgoal 2.1.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS1 : lookupScopes I Ctx (intVal I1)
NL : I = I -> false
NL1 : no_lookup [(L, LV)] I
============================
 I1 = IV
 < apply NL to _.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : I1 > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
Eq : I1 = IV
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Eq.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : IV > 0
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal IV)
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < clear Ev.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Eq: assert LV = recVal Fields1.

Subgoal 2.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 LV = recVal Fields1
 < LS: case Ev1.

Subgoal 2.2.1:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS : lookup [] L (recVal Fields1)
============================
 LV = recVal Fields1
 < case LS.

Subgoal 2.2.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS : no_lookup [] L
LS1 : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields1)
============================
 LV = recVal Fields1
 < clear LS.

Subgoal 2.2.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS1 : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields1)
============================
 LV = recVal Fields1
 < LS: case LS1.

Subgoal 2.2.2.1:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS : lookup [(I, intVal IV), (L, LV)] L (recVal Fields1)
============================
 LV = recVal Fields1
 < L: case LS.

Subgoal 2.2.2.1:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
L : I = L -> false
L1 : lookup [(L, LV)] L (recVal Fields1)
============================
 LV = recVal Fields1
 < L': case L1.

Subgoal 2.2.2.1.1:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
L : I = L -> false
============================
 recVal Fields1 = recVal Fields1
 < search.

Subgoal 2.2.2.1.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
L : I = L -> false
L' : L = L -> false
L'1 : lookup [] L (recVal Fields1)
============================
 LV = recVal Fields1
 < apply L' to _.

Subgoal 2.2.2.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS : no_lookup [(I, intVal IV), (L, LV)] L
LS1 : lookupScopes L Ctx (recVal Fields1)
============================
 LV = recVal Fields1
 < NL: case LS.

Subgoal 2.2.2.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS1 : lookupScopes L Ctx (recVal Fields1)
NL : I = L -> false
NL1 : no_lookup [(L, LV)] L
============================
 LV = recVal Fields1
 < NL': case NL1.

Subgoal 2.2.2.2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
LS1 : lookupScopes L Ctx (recVal Fields1)
NL : I = L -> false
NL' : L = L -> false
NL'1 : no_lookup [] L
============================
 LV = recVal Fields1
 < apply NL' to _.

Subgoal 2:

Variables: LV IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, LV)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, LV)]::Ctx)) (recVal Fields1)
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
Eq : LV = recVal Fields1
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Eq.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev1 : lookupScopes L ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) (recVal Fields1)
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < clear Ev1.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < Eq: assert EE6 = []::([(L, V1), (I, intVal IV)]::Ctx).

Subgoal 2.3:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
============================
 EE6 = []::([(L, V1), (I, intVal IV)]::Ctx)
 < R: case Ev7.

Subgoal 2.3.1:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 LRemain
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) (((L, V1)::LRemain)::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I (((L, V1)::LRemain)::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) (intVal I4)
R : mem (L, I6) []
R1 : remove_all [] L LRemain
============================
 ((L, V1)::LRemain)::([(I, intVal IV), (L, recVal Fields1)]::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < case R.

Subgoal 2.3.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::New) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::New) (intVal I4)
R : no_lookup [] L
R1 : replaceScopes L V1 ([(I, intVal IV), (L, recVal Fields1)]::Ctx) New
============================
 []::New = []::([(L, V1), (I, intVal IV)]::Ctx)
 < clear R.

Subgoal 2.3.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::New) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::New) (intVal I4)
R1 : replaceScopes L V1 ([(I, intVal IV), (L, recVal Fields1)]::Ctx) New
============================
 []::New = []::([(L, V1), (I, intVal IV)]::Ctx)
 < R: case R1.

Subgoal 2.3.2.1:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 LRemain
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::(((L, V1)::LRemain)::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::(((L, V1)::LRemain)::Ctx)) (intVal I4)
R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)]
R1 : remove_all [(I, intVal IV), (L, recVal Fields1)] L LRemain
============================
 []::(((L, V1)::LRemain)::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < RA: case R1.

Subgoal 2.3.2.1.1:

Variables: IV V FE Ctx Ctx' O L Fields Scope EE2 V1 Fields1 I4 I3 I6 LRemain
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = L -> false
NEqIL : L = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name L) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign L (minus (name L) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes L (intVal I3) ([]::(((L, V1)::LRemain)::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes L ([]::(((L, V1)::LRemain)::Ctx)) (intVal I4)
R : mem (L, I6) [(L, intVal IV), (L, recVal Fields1)]
RA : remove_all [(L, recVal Fields1)] L LRemain
============================
 []::(((L, V1)::LRemain)::Ctx) = []::([(L, V1), (L, intVal IV)]::Ctx)
 < apply NEqLI to _.

Subgoal 2.3.2.1.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 R
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::(((L, V1)::((I, intVal IV)::R))::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::(((L, V1)::((I, intVal IV)::R))::Ctx)) (intVal I4)
R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)]
RA : I = L -> false
RA1 : remove_all [(L, recVal Fields1)] L R
============================
 []::(((L, V1)::((I, intVal IV)::R))::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < RA': case RA1.

Subgoal 2.3.2.1.2.1:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 R
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::(((L, V1)::((I, intVal IV)::R))::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::(((L, V1)::((I, intVal IV)::R))::Ctx)) (intVal I4)
R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)]
RA : I = L -> false
RA' : remove_all [] L R
============================
 []::(((L, V1)::((I, intVal IV)::R))::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < case RA'.

Subgoal 2.3.2.1.2.1:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4)
R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)]
RA : I = L -> false
============================
 []::([(L, V1), (I, intVal IV)]::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < search.

Subgoal 2.3.2.1.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 I6 R1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::(((L, V1)::((I, intVal IV)::((L, recVal Fields1)::R1)))::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::(((L, V1)::((I, intVal IV)::((L, recVal Fields1)::R1)))::Ctx)) (intVal I4)
R : mem (L, I6) [(I, intVal IV), (L, recVal Fields1)]
RA : I = L -> false
RA' : L = L -> false
RA'1 : remove_all [] L R1
============================
 []::(((L, V1)::((I, intVal IV)::((L, recVal Fields1)::R1)))::Ctx) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < apply RA' to _.

Subgoal 2.3.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (intVal I4)
R : no_lookup [(I, intVal IV), (L, recVal Fields1)] L
R1 : replaceScopes L V1 Ctx New1
============================
 []::([(I, intVal IV), (L, recVal Fields1)]::New1) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < NL: case R.

Subgoal 2.3.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (intVal I4)
R1 : replaceScopes L V1 Ctx New1
NL : I = L -> false
NL1 : no_lookup [(L, recVal Fields1)] L
============================
 []::([(I, intVal IV), (L, recVal Fields1)]::New1) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < NL': case NL1.

Subgoal 2.3.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3 New1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::([(I, intVal IV), (L, recVal Fields1)]::New1)) (intVal I4)
R1 : replaceScopes L V1 Ctx New1
NL : I = L -> false
NL' : L = L -> false
NL'1 : no_lookup [] L
============================
 []::([(I, intVal IV), (L, recVal Fields1)]::New1) = []::([(L, V1), (I, intVal IV)]::Ctx)
 < apply NL' to _.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 EE6 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) EE6
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) EE6 (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I EE6 (intVal I4)
Eq : EE6 = []::([(L, V1), (I, intVal IV)]::Ctx)
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < case Eq.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev7 : replaceScopes L V1 ([]::([(I, intVal IV), (L, recVal Fields1)]::Ctx)) ([]::([(L, V1), (I, intVal IV)]::Ctx))
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4)
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < clear Ev7.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4)
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < Eq: assert I4 = IV.

Subgoal 2.4:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4)
============================
 I4 = IV
 < LS: case Ev3.

Subgoal 2.4.1:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
LS : lookup [] I (intVal I4)
============================
 I4 = IV
 < case LS.

Subgoal 2.4.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
LS : no_lookup [] I
LS1 : lookupScopes I ([(L, V1), (I, intVal IV)]::Ctx) (intVal I4)
============================
 I4 = IV
 < clear LS.

Subgoal 2.4.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
LS1 : lookupScopes I ([(L, V1), (I, intVal IV)]::Ctx) (intVal I4)
============================
 I4 = IV
 < LS: case LS1.

Subgoal 2.4.2.1:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
LS : lookup [(L, V1), (I, intVal IV)] I (intVal I4)
============================
 I4 = IV
 < L: case LS.

Subgoal 2.4.2.1.1:

Variables: IV V FE Ctx Ctx' O I Fields Scope EE2 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes I Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : I = I -> false
NEqIL : I = I -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign I (recFieldAccess (name I) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" (intVal I4)
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(I, intVal I4), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
============================
 I4 = IV
 < apply NEqIL to _.

Subgoal 2.4.2.1.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
L : L = I -> false
L1 : lookup [(I, intVal IV)] I (intVal I4)
============================
 I4 = IV
 < L': case L1.

Subgoal 2.4.2.1.2.1:

Variables: V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : I4 >= 0
IsIV : is_integer I4
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : I4 > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal I4)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
L : L = I -> false
============================
 I4 = I4
 < search.

Subgoal 2.4.2.1.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
L : L = I -> false
L' : I = I -> false
L'1 : lookup [] I (intVal I4)
============================
 I4 = IV
 < apply L' to _.

Subgoal 2.4.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
LS : no_lookup [(L, V1), (I, intVal IV)] I
LS1 : lookupScopes I Ctx (intVal I4)
============================
 I4 = IV
 < NL: case LS.

Subgoal 2.4.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
LS1 : lookupScopes I Ctx (intVal I4)
NL : L = I -> false
NL1 : no_lookup [(I, intVal IV)] I
============================
 I4 = IV
 < NL': case NL1.

Subgoal 2.4.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
LS1 : lookupScopes I Ctx (intVal I4)
NL : L = I -> false
NL' : I = I -> false
NL'1 : no_lookup [] I
============================
 I4 = IV
 < apply NL' to _.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I4 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : I4 - 1 = I3
Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal I4)
Eq : I4 = IV
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < case Eq.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : IV - 1 = I3
Ev3 : lookupScopes I ([]::([(L, V1), (I, intVal IV)]::Ctx)) (intVal IV)
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < clear Ev3.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : IV - 1 = I3
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < Eq: assert Scope::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx).

Subgoal 2.5:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : IV - 1 = I3
============================
 Scope::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx)
 < R: case Ev5.

Subgoal 2.5.1:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 LRemain
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(L, V1), (I, intVal IV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : mem (I, I6) []
R1 : remove_all [] I LRemain
============================
 ((I, intVal I3)::LRemain)::([(L, V1), (I, intVal IV)]::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < case R.

Subgoal 2.5.2:

Variables: IV V FE Ctx Ctx' O I L Fields EE2 V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : no_lookup [] I
R1 : replaceScopes I (intVal I3) ([(L, V1), (I, intVal IV)]::Ctx) EE2
============================
 []::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx)
 < clear R.

Subgoal 2.5.2:

Variables: IV V FE Ctx Ctx' O I L Fields EE2 V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R1 : replaceScopes I (intVal I3) ([(L, V1), (I, intVal IV)]::Ctx) EE2
============================
 []::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx)
 < R: case R1.

Subgoal 2.5.2.1:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 LRemain
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE (((I, intVal I3)::LRemain)::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : mem (I, I6) [(L, V1), (I, intVal IV)]
R1 : remove_all [(L, V1), (I, intVal IV)] I LRemain
============================
 []::(((I, intVal I3)::LRemain)::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < RA: case R1.

Subgoal 2.5.2.1.1:

Variables: IV V FE Ctx Ctx' O I Fields V1 Fields1 I3 I6 LRemain
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes I Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : I = I -> false
NEqIL : I = I -> false
Ev2 : evalStmt FE (((I, intVal I3)::LRemain)::Ctx) (while (greater (name I) (num 0)) (seq (assign I (recFieldAccess (name I) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : mem (I, I6) [(I, V1), (I, intVal IV)]
RA : remove_all [(I, intVal IV)] I LRemain
============================
 []::(((I, intVal I3)::LRemain)::Ctx) = []::([(I, intVal I3), (I, V1)]::Ctx)
 < apply NEqLI to _.

Subgoal 2.5.2.1.2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 R
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE (((I, intVal I3)::((L, V1)::R))::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : mem (I, I6) [(L, V1), (I, intVal IV)]
RA : L = I -> false
RA1 : remove_all [(I, intVal IV)] I R
============================
 []::(((I, intVal I3)::((L, V1)::R))::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < RA': case RA1.

Subgoal 2.5.2.1.2.1:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 R
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE (((I, intVal I3)::((L, V1)::R))::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : mem (I, I6) [(L, V1), (I, intVal IV)]
RA : L = I -> false
RA' : remove_all [] I R
============================
 []::(((I, intVal I3)::((L, V1)::R))::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < case RA'.

Subgoal 2.5.2.1.2.1:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : mem (I, I6) [(L, V1), (I, intVal IV)]
RA : L = I -> false
============================
 []::([(I, intVal I3), (L, V1)]::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < search.

Subgoal 2.5.2.1.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 I6 R1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE (((I, intVal I3)::((L, V1)::((I, intVal IV)::R1)))::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : mem (I, I6) [(L, V1), (I, intVal IV)]
RA : L = I -> false
RA' : I = I -> false
RA'1 : remove_all [] I R1
============================
 []::(((I, intVal I3)::((L, V1)::((I, intVal IV)::R1)))::Ctx) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < apply RA' to _.

Subgoal 2.5.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 New
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(L, V1), (I, intVal IV)]::New) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R : no_lookup [(L, V1), (I, intVal IV)] I
R1 : replaceScopes I (intVal I3) Ctx New
============================
 []::([(L, V1), (I, intVal IV)]::New) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < NL: case R.

Subgoal 2.5.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 New
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(L, V1), (I, intVal IV)]::New) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R1 : replaceScopes I (intVal I3) Ctx New
NL : L = I -> false
NL1 : no_lookup [(I, intVal IV)] I
============================
 []::([(L, V1), (I, intVal IV)]::New) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < NL': case NL1.

Subgoal 2.5.2.2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3 New
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(L, V1), (I, intVal IV)]::New) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
R1 : replaceScopes I (intVal I3) Ctx New
NL : L = I -> false
NL' : I = I -> false
NL'1 : no_lookup [] I
============================
 []::([(L, V1), (I, intVal IV)]::New) = []::([(I, intVal I3), (L, V1)]::Ctx)
 < apply NL' to _.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields Scope EE2 V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE EE2 (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) (Scope::EE2)
Ev9 : IV - 1 = I3
Eq : Scope::EE2 = []::([(I, intVal I3), (L, V1)]::Ctx)
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < case Eq.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev5 : replaceScopes I (intVal I3) ([]::([(L, V1), (I, intVal IV)]::Ctx)) ([]::([(I, intVal I3), (L, V1)]::Ctx))
Ev9 : IV - 1 = I3
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < clear Ev5.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < apply minus_integer_is_integer to _ _ Ev9.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < P: apply minus_plus_same_integer to _ _ Ev9.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < P': apply plus_integer_comm to _ _ P.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < M: apply plus_minus_same_integer to _ _ P'.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < assert I3 >= 0.

Subgoal 2.6:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
============================
 I3 >= 0
 < GEq1: apply greater_integer_step_greatereq to _ _ Ev10 _.

Subgoal 2.6:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
GEq1 : IV >= 1
============================
 I3 >= 0
 < Or: apply is_integer_related to _ _ with
         A = IV B = 1.

Subgoal 2.6:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
GEq1 : IV >= 1
Or : (IV = 1 \/ IV < 1) \/ IV > 1
============================
 I3 >= 0
 < C: case Or.

Subgoal 2.6.1:

Variables: V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : 1 >= 0
IsIV : is_integer 1
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : 1 > 0
Ev9 : 1 - 1 = I3
H1 : is_integer I3
P : I3 + 1 = 1
P' : 1 + I3 = 1
M : 1 - I3 = 1
GEq1 : 1 >= 1
============================
 I3 >= 0
 < compute Ev9.

Subgoal 2.6.1:

Variables: V FE Ctx Ctx' O I L Fields V1 Fields1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : 1 >= 0
IsIV : is_integer 1
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal 0), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : 1 > 0
Ev9 : 1 - 1 = 0
H1 : is_integer 0
P : 0 + 1 = 1
P' : 1 + 0 = 1
M : 1 - 0 = 1
GEq1 : 1 >= 1
============================
 0 >= 0
 < search.

Subgoal 2.6.2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
GEq1 : IV >= 1
C : IV < 1
============================
 I3 >= 0
 < LEq1: case GEq1.

Subgoal 2.6.2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
C : IV < 1
LEq1 : 1 <= IV
============================
 I3 >= 0
 < apply less_lesseq_flip_false to C LEq1.

Subgoal 2.6.3:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
GEq1 : IV >= 1
C : IV > 1
============================
 I3 >= 0
 < case C.

Subgoal 2.6.3:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
GEq1 : IV >= 1
H2 : 1 < IV
============================
 I3 >= 0
 < LI3: apply minus_smaller_positive to Ev9 _.

Subgoal 2.6.3:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
GEq1 : IV >= 1
H2 : 1 < IV
LI3 : 0 < I3
============================
 I3 >= 0
 < apply less_integer_lesseq to LI3.

Subgoal 2.6.3:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
GEq1 : IV >= 1
H2 : 1 < IV
LI3 : 0 < I3
H3 : 0 <= I3
============================
 I3 >= 0
 < search.

Subgoal 2:

Variables: IV V FE Ctx Ctx' O I L Fields V1 Fields1 I3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
H2 : I3 >= 0
============================
 (listIndex (recVal Fields1) IV V /\ O = []) /\
 (exists Scope, Ctx' = Scope::Ctx)
 < apply IH to Ev2 LkpL LkpHead _ _ _.

Subgoal 2:

Variables: IV V FE Ctx I L Fields V1 Fields1 I3 Scope1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L (Scope1::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : evalStmt FE ([(I, intVal I3), (L, V1)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) (Scope1::Ctx) [] *
Ev8 : lookup Fields1 "tail" V1
Ev10 : IV > 0
Ev9 : IV - 1 = I3
H1 : is_integer I3
P : I3 + 1 = IV
P' : 1 + I3 = IV
M : IV - I3 = 1
H2 : I3 >= 0
H3 : listIndex V1 I3 V
============================
 (listIndex (recVal Fields1) IV V /\ [] = []) /\
 (exists Scope, Scope1::Ctx = Scope::Ctx)
 < search.

Subgoal 3:

Variables: LV IV V FE Ctx Ctx' O I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (greater (name I) (num 0)) falseVal Ctx' O *
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev.

Subgoal 3:

Variables: LV IV V FE Ctx Ctx' O I L Fields I1 EE1 O2 I2 O3
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (name I) (intVal I1) EE1 O2 *
Ev1 : evalExpr FE EE1 (num 0) (intVal I2) Ctx' O3 *
Ev2 : I1 <= I2
Ev3 : O2 ++ O3 = O
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < case Ev1.

Subgoal 3:

Variables: LV IV V FE Ctx Ctx' O I L Fields I1 O2
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L Ctx' (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev : evalExpr FE ([(I, intVal IV), (L, LV)]::Ctx) (name I) (intVal I1) Ctx' O2 *
Ev2 : I1 <= 0
Ev3 : O2 ++ [] = O
============================
 (listIndex LV IV V /\ O = []) /\ (exists Scope, Ctx' = Scope::Ctx)
 < Ev: case Ev.

Subgoal 3:

Variables: LV IV V FE Ctx O I L Fields I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : I1 <= 0
Ev3 : [] ++ [] = O
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
============================
 (listIndex LV IV V /\ O = []) /\
 (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
 < Eq: assert I1 = IV.

Subgoal 3.1:

Variables: LV IV V FE Ctx O I L Fields I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : I1 <= 0
Ev3 : [] ++ [] = O
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
============================
 I1 = IV
 < LS: case Ev.

Subgoal 3.1.1:

Variables: LV IV V FE Ctx O I L Fields I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : I1 <= 0
Ev3 : [] ++ [] = O
LS : lookup [(I, intVal IV), (L, LV)] I (intVal I1)
============================
 I1 = IV
 < L: case LS.

Subgoal 3.1.1.1:

Variables: LV V FE Ctx O I L Fields I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal I1), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : I1 >= 0
IsIV : is_integer I1
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : I1 <= 0
Ev3 : [] ++ [] = O
============================
 I1 = I1
 < search.

Subgoal 3.1.1.2:

Variables: LV IV V FE Ctx O I L Fields I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : I1 <= 0
Ev3 : [] ++ [] = O
L : I = I -> false
L1 : lookup [(L, LV)] I (intVal I1)
============================
 I1 = IV
 < apply L to _.

Subgoal 3.1.2:

Variables: LV IV V FE Ctx O I L Fields I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : I1 <= 0
Ev3 : [] ++ [] = O
LS : no_lookup [(I, intVal IV), (L, LV)] I
LS1 : lookupScopes I Ctx (intVal I1)
============================
 I1 = IV
 < NL: case LS.

Subgoal 3.1.2:

Variables: LV IV V FE Ctx O I L Fields I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : I1 <= 0
Ev3 : [] ++ [] = O
LS1 : lookupScopes I Ctx (intVal I1)
NL : I = I -> false
NL1 : no_lookup [(L, LV)] I
============================
 I1 = IV
 < apply NL to _.

Subgoal 3:

Variables: LV IV V FE Ctx O I L Fields I1
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : I1 <= 0
Ev3 : [] ++ [] = O
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal I1)
Eq : I1 = IV
============================
 (listIndex LV IV V /\ O = []) /\
 (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
 < case Eq.

Subgoal 3:

Variables: LV IV V FE Ctx O I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : IV <= 0
Ev3 : [] ++ [] = O
Ev : lookupScopes I ([(I, intVal IV), (L, LV)]::Ctx) (intVal IV)
============================
 (listIndex LV IV V /\ O = []) /\
 (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
 < clear Ev.

Subgoal 3:

Variables: LV IV V FE Ctx O I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : IV <= 0
Ev3 : [] ++ [] = O
============================
 (listIndex LV IV V /\ O = []) /\
 (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
 < case Ev3.

Subgoal 3:

Variables: LV IV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : IV <= 0
============================
 (listIndex LV IV V /\ [] = []) /\
 (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
 < Eq: assert IV = 0.

Subgoal 3.2:

Variables: LV IV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : IV <= 0
============================
 IV = 0
 < Or: apply greatereq_integer_greater_or_eq to GEqIV.

Subgoal 3.2:

Variables: LV IV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : IV <= 0
Or : IV > 0 \/ IV = 0
============================
 IV = 0
 < C: case Or.

Subgoal 3.2.1:

Variables: LV IV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : IV <= 0
C : IV > 0
============================
 IV = 0
 < L: case C.

Subgoal 3.2.1:

Variables: LV IV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : IV <= 0
L : 0 < IV
============================
 IV = 0
 < apply less_lesseq_flip_false to L Ev2.

Subgoal 3.2.2:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal 0), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
============================
 0 = 0
 < search.

Subgoal 3:

Variables: LV IV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal IV), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : IV >= 0
IsIV : is_integer IV
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : IV <= 0
Eq : IV = 0
============================
 (listIndex LV IV V /\ [] = []) /\
 (exists Scope, [(I, intVal IV), (L, LV)]::Ctx = Scope::Ctx)
 < case Eq.

Subgoal 3:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal 0), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
============================
 (listIndex LV 0 V /\ [] = []) /\
 (exists Scope, [(I, intVal 0), (L, LV)]::Ctx = Scope::Ctx)
 < Eq: assert LV = recVal Fields.

Subgoal 3.3:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal 0), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
============================
 LV = recVal Fields
 < LS: case LkpL.

Subgoal 3.3.1:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
LS : lookup [(I, intVal 0), (L, LV)] L (recVal Fields)
============================
 LV = recVal Fields
 < L: case LS.

Subgoal 3.3.1:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
L : I = L -> false
L1 : lookup [(L, LV)] L (recVal Fields)
============================
 LV = recVal Fields
 < L': case L1.

Subgoal 3.3.1.1:

Variables: V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
L : I = L -> false
============================
 recVal Fields = recVal Fields
 < search.

Subgoal 3.3.1.2:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
L : I = L -> false
L' : L = L -> false
L'1 : lookup [] L (recVal Fields)
============================
 LV = recVal Fields
 < apply L' to _.

Subgoal 3.3.2:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
LS : no_lookup [(I, intVal 0), (L, LV)] L
LS1 : lookupScopes L Ctx (recVal Fields)
============================
 LV = recVal Fields
 < NL: case LS.

Subgoal 3.3.2:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
LS1 : lookupScopes L Ctx (recVal Fields)
NL : I = L -> false
NL1 : no_lookup [(L, LV)] L
============================
 LV = recVal Fields
 < NL': case NL1.

Subgoal 3.3.2:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
LS1 : lookupScopes L Ctx (recVal Fields)
NL : I = L -> false
NL' : L = L -> false
NL'1 : no_lookup [] L
============================
 LV = recVal Fields
 < apply NL' to _.

Subgoal 3:

Variables: LV V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal 0), (L, LV)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
Eq : LV = recVal Fields
============================
 (listIndex LV 0 V /\ [] = []) /\
 (exists Scope, [(I, intVal 0), (L, LV)]::Ctx = Scope::Ctx)
 < case Eq.

Subgoal 3:

Variables: V FE Ctx I L Fields
IH : forall LV IV V FE Ctx Ctx' O I L Fields,
       evalStmt FE ([(I, intVal IV), (L, LV)]::Ctx) (while (greater (name I) (num 0)) (seq (assign L (recFieldAccess (name L) "tail")) (assign I (minus (name I) (num 1))))) Ctx' O * ->
       lookupScopes L Ctx' (recVal Fields) -> lookup Fields "head" V -> IV >= 0 ->
       is_integer IV -> (L = I -> false) -> (listIndex LV IV V /\ O = []) /\
       (exists Scope, Ctx' = Scope::Ctx)
LkpL : lookupScopes L ([(I, intVal 0), (L, recVal Fields)]::Ctx) (recVal Fields)
LkpHead : lookup Fields "head" V
GEqIV : 0 >= 0
IsIV : is_integer 0
NEqLI : L = I -> false
NEqIL : I = L -> false
Ev2 : 0 <= 0
============================
 (listIndex (recVal Fields) 0 V /\ [] = []) /\
 (exists Scope, [(I, intVal 0), (L, recVal Fields)]::Ctx = Scope::Ctx)
 < search.

Proof completed.
 < Theorem length_to_while :
     forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal.

============================
 forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
   listLength LV CurrLen -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
   is_integer StoreLen -> is_integer CurrLen -> exists Fields,
     <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
     lookup Fields "null" trueVal
 < induction on 1.

IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
============================
 forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
   listLength LV CurrLen @ -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
   is_integer StoreLen -> is_integer CurrLen -> exists Fields,
     <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
     lookup Fields "null" trueVal
 < intros Len NEq P IsSLen IsCLen.

Variables: LV StoreLen L Len CurrLen TotalLen FE Ctx
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
Len : listLength LV CurrLen @
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
============================
 exists Fields,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
   lookup Fields "null" trueVal
 < assert Len = L -> false.

Subgoal 1:

Variables: LV StoreLen L Len CurrLen TotalLen FE Ctx
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
Len : listLength LV CurrLen @
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
============================
 Len = L -> false
 < intros E.

Subgoal 1:

Variables: LV StoreLen L Len CurrLen TotalLen FE Ctx
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
Len : listLength LV CurrLen @
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
E : Len = L
============================
 false
 < case E.

Subgoal 1:

Variables: LV StoreLen L CurrLen TotalLen FE Ctx
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
Len : listLength LV CurrLen @
NEq : L = L -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
============================
 false
 < backchain NEq.

Variables: LV StoreLen L Len CurrLen TotalLen FE Ctx
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
Len : listLength LV CurrLen @
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
============================
 exists Fields,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
   lookup Fields "null" trueVal
 < Len: case Len.

Subgoal 2:

Variables: StoreLen L Len TotalLen FE Ctx Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : 0 + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer 0
H1 : Len = L -> false
Len : lookup Fields "null" trueVal
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < case P.

Subgoal 2:

Variables: L Len TotalLen FE Ctx Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
IsSLen : is_integer TotalLen
IsCLen : is_integer 0
H1 : Len = L -> false
Len : lookup Fields "null" trueVal
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < exists Fields.

Subgoal 2:

Variables: L Len TotalLen FE Ctx Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
IsSLen : is_integer TotalLen
IsCLen : is_integer 0
H1 : Len = L -> false
Len : lookup Fields "null" trueVal
============================
 <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
 lookup Fields "null" trueVal
 < split.

Subgoal 2.1:

Variables: L Len TotalLen FE Ctx Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
IsSLen : is_integer TotalLen
IsCLen : is_integer 0
H1 : Len = L -> false
Len : lookup Fields "null" trueVal
============================
 <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0
 < assert lookupScopes L ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (recVal Fields).

Subgoal 2.1:

Variables: L Len TotalLen FE Ctx Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
IsSLen : is_integer TotalLen
IsCLen : is_integer 0
H1 : Len = L -> false
Len : lookup Fields "null" trueVal
H2 : lookupScopes L ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (recVal Fields)
============================
 <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0
 < assert <evalExpr {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) falseVal ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0.

Subgoal 2.1:

Variables: L Len TotalLen FE Ctx Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
IsSLen : is_integer TotalLen
IsCLen : is_integer 0
H1 : Len = L -> false
Len : lookup Fields "null" trueVal
H2 : lookupScopes L ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (recVal Fields)
H3 : <evalExpr {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) falseVal ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0
============================
 <evalStmt {ES}> FE ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0
 < search.

Subgoal 2.2:

Variables: L Len TotalLen FE Ctx Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
IsSLen : is_integer TotalLen
IsCLen : is_integer 0
H1 : Len = L -> false
Len : lookup Fields "null" trueVal
============================
 lookup Fields "null" trueVal
 < search.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < LSL: assert lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields).

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < EvC: assert <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < EvL: assert <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0.

Subgoal 3.1:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
============================
 <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
 < search 20.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < P': apply plus_integer_total to _ IsSLen with
         N1 = 1.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < apply plus_integer_is_integer to _ _ P'.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < EvE: assert <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0.

Subgoal 3.2:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
============================
 <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
 < apply plus_integer_comm to _ _ P'.

Subgoal 3.2:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
H3 : StoreLen + 1 = N3
============================
 <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
 < search 20.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < IsI: apply plus_integer_is_integer_result to _ Len3.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
IsI1 : is_integer 1
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < clear IsI1.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < assert I + N3 = TotalLen.

Subgoal 3.3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
============================
 I + N3 = TotalLen
 < OrigP': apply plus_integer_comm to _ _ P.

Subgoal 3.3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
OrigP' : StoreLen + CurrLen = TotalLen
============================
 I + N3 = TotalLen
 < AssocP: apply plus_integer_assoc to _ _ _ Len3 OrigP'.

Subgoal 3.3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 Subtotal'
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
OrigP' : StoreLen + CurrLen = TotalLen
AssocP : 1 + StoreLen = Subtotal'
AssocP1 : I + Subtotal' = TotalLen
============================
 I + N3 = TotalLen
 < apply plus_integer_unique to P' AssocP.

Subgoal 3.3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields Subtotal'
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = Subtotal'
H2 : is_integer Subtotal'
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal Subtotal'), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
OrigP' : StoreLen + CurrLen = TotalLen
AssocP : 1 + StoreLen = Subtotal'
AssocP1 : I + Subtotal' = TotalLen
============================
 I + Subtotal' = TotalLen
 < search.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
H3 : I + N3 = TotalLen
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < apply IH to Len2 NEq _ _ _ with
     TotalLen = TotalLen StoreLen = N3 FE = FE Ctx = Ctx.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 Fields1
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
H3 : I + N3 = TotalLen
H4 : <evalStmt {ES}> FE ([(Len, intVal N3), (L, Tl)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0
H5 : lookup Fields1 "null" trueVal
============================
 exists Fields1,
   <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
   lookup Fields1 "null" trueVal
 < exists Fields1.

Subgoal 3:

Variables: StoreLen L Len CurrLen TotalLen FE Ctx Tl I Fields N3 Fields1
IH : forall LV StoreLen L Len CurrLen TotalLen FE Ctx,
       listLength LV CurrLen * -> (L = Len -> false) -> CurrLen + StoreLen = TotalLen ->
       is_integer StoreLen -> is_integer CurrLen -> exists Fields,
         <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields)]::Ctx) [] 0 /\
         lookup Fields "null" trueVal
NEq : L = Len -> false
P : CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
IsCLen : is_integer CurrLen
H1 : Len = L -> false
Len : lookup Fields "null" falseVal
Len1 : lookup Fields "tail" Tl
Len2 : listLength Tl I *
Len3 : I + 1 = CurrLen
LSL : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
EvC : <evalExpr {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) [] 0
EvL : <evalStmt {ES}> FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) [] 0
P' : 1 + StoreLen = N3
H2 : is_integer N3
EvE : <evalStmt {ES}> FE ([]::([(L, Tl), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) ([]::([(Len, intVal N3), (L, Tl)]::Ctx)) [] 0
IsI : is_integer I
H3 : I + N3 = TotalLen
H4 : <evalStmt {ES}> FE ([(Len, intVal N3), (L, Tl)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0
H5 : lookup Fields1 "null" trueVal
============================
 <evalStmt {ES}> FE ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal TotalLen), (L, recVal Fields1)]::Ctx) [] 0 /\
 lookup Fields1 "null" trueVal
 < search.

Proof completed.
 < Theorem while_to_length :
     forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen.

============================
 forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
   evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O ->
   lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
   exists Scope TotalLen CurrLen,
     ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
     listLength LV CurrLen) /\
     is_integer CurrLen) /\
     CurrLen + StoreLen = TotalLen
 < induction on 1.

IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
============================
 forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
   evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O @ ->
   lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
   exists Scope TotalLen CurrLen,
     ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
     listLength LV CurrLen) /\
     is_integer CurrLen) /\
     CurrLen + StoreLen = TotalLen
 < intros Ev LS IsSLen NEq.

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
Ev : evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O @
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O EE1 O2 Scope EE2 O3 O4 O12
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (not (recFieldAccess (name L) "null")) trueVal EE1 O2 *
Ev1 : evalStmt FE ([]::EE1) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O EE1 O2 Scope EE2 O3 O4 O12
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::EE1) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recFieldAccess (name L) "null") falseVal EE1 O2 *
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O EE1 O2 Scope EE2 O3 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::EE1) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (name L) (recVal Fields) EE1 O2 *
Ev5 : lookup Fields "null" falseVal
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O3 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Ev3.

Subgoal 1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Eq: assert LV = recVal Fields.

Subgoal 1.1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields)
============================
 LV = recVal Fields
 < LS: case Ev.

Subgoal 1.1.1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
LS1 : lookup [(Len, intVal StoreLen), (L, LV)] L (recVal Fields)
============================
 LV = recVal Fields
 < L: case LS1.

Subgoal 1.1.1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
L : Len = L -> false
L1 : lookup [(L, LV)] L (recVal Fields)
============================
 LV = recVal Fields
 < L': case L1.

Subgoal 1.1.1.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
L : Len = L -> false
============================
 recVal Fields = recVal Fields
 < search.

Subgoal 1.1.1.2:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
L : Len = L -> false
L' : L = L -> false
L'1 : lookup [] L (recVal Fields)
============================
 LV = recVal Fields
 < apply L' to _.

Subgoal 1.1.2:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
LS1 : no_lookup [(Len, intVal StoreLen), (L, LV)] L
LS2 : lookupScopes L Ctx (recVal Fields)
============================
 LV = recVal Fields
 < NL: case LS1.

Subgoal 1.1.2:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
LS2 : lookupScopes L Ctx (recVal Fields)
NL : Len = L -> false
NL1 : no_lookup [(L, LV)] L
============================
 LV = recVal Fields
 < NL': case NL1.

Subgoal 1.1.2:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
LS2 : lookupScopes L Ctx (recVal Fields)
NL : Len = L -> false
NL' : L = L -> false
NL'1 : no_lookup [] L
============================
 LV = recVal Fields
 < apply NL' to _.

Subgoal 1:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, LV)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields)
Eq : LV = recVal Fields
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Eq.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < clear Ev.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1)))) (Scope::EE2) O12 *
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev1.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 O1 O5
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign L (recFieldAccess (name L) "tail")) EE3 O1 *
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O5 *
Ev3 : O1 ++ O5 = O12
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 O1 O5 V EE4
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O5 *
Ev3 : O1 ++ O5 = O12
Ev : evalExpr FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recFieldAccess (name L) "tail") V EE4 O1 *
Ev6 : replaceScopes L V EE4 EE3
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 O1 O5 V EE4 Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O5 *
Ev3 : O1 ++ O5 = O12
Ev6 : replaceScopes L V EE4 EE3
Ev : evalExpr FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (name L) (recVal Fields1) EE4 O1 *
Ev7 : lookup Fields1 "tail" V
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 O5 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O5 *
Ev3 : [] ++ O5 = O12
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields1)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Ev3.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields1)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Eq: assert Fields1 = Fields.

Subgoal 1.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields1)
============================
 Fields1 = Fields
 < LS': case Ev.

Subgoal 1.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
LS' : lookup [] L (recVal Fields1)
============================
 Fields1 = Fields
 < case LS'.

Subgoal 1.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
LS' : no_lookup [] L
LS'1 : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields1)
============================
 Fields1 = Fields
 < clear LS'.

Subgoal 1.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
LS'1 : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields1)
============================
 Fields1 = Fields
 < LS': case LS'1.

Subgoal 1.2.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
LS' : lookup [(Len, intVal StoreLen), (L, recVal Fields)] L (recVal Fields1)
============================
 Fields1 = Fields
 < L: case LS'.

Subgoal 1.2.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
L : Len = L -> false
L1 : lookup [(L, recVal Fields)] L (recVal Fields1)
============================
 Fields1 = Fields
 < L': case L1.

Subgoal 1.2.2.1.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields1 "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields1)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
L : Len = L -> false
============================
 Fields1 = Fields1
 < search.

Subgoal 1.2.2.1.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
L : Len = L -> false
L' : L = L -> false
L'1 : lookup [] L (recVal Fields1)
============================
 Fields1 = Fields
 < apply L' to _.

Subgoal 1.2.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
LS' : no_lookup [(Len, intVal StoreLen), (L, recVal Fields)] L
LS'1 : lookupScopes L Ctx (recVal Fields1)
============================
 Fields1 = Fields
 < NL: case LS'.

Subgoal 1.2.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
LS'1 : lookupScopes L Ctx (recVal Fields1)
NL : Len = L -> false
NL1 : no_lookup [(L, recVal Fields)] L
============================
 Fields1 = Fields
 < NL': case NL1.

Subgoal 1.2.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
LS'1 : lookupScopes L Ctx (recVal Fields1)
NL : Len = L -> false
NL' : L = L -> false
NL'1 : no_lookup [] L
============================
 Fields1 = Fields
 < apply NL' to _.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V Fields1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields1 "tail" V
Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields1)
Eq : Fields1 = Fields
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Eq.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields "tail" V
Ev : lookupScopes L ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (recVal Fields)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < clear Ev.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields "tail" V
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Eq: assert EE3 = []::([(L, V), (Len, intVal StoreLen)]::Ctx).

Subgoal 1.3:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields "tail" V
============================
 EE3 = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < RS: case Ev6.

Subgoal 1.3.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I LRemain
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE (((L, V)::LRemain)::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : mem (L, I) []
RS1 : remove_all [] L LRemain
============================
 ((L, V)::LRemain)::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < case RS.

Subgoal 1.3.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::New) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : no_lookup [] L
RS1 : replaceScopes L V ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) New
============================
 []::New = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < clear RS.

Subgoal 1.3.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::New) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS1 : replaceScopes L V ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) New
============================
 []::New = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < RS: case RS1.

Subgoal 1.3.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I LRemain
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::(((L, V)::LRemain)::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)]
RS1 : remove_all [(Len, intVal StoreLen), (L, recVal Fields)] L LRemain
============================
 []::(((L, V)::LRemain)::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < RA: case RS1.

Subgoal 1.3.2.1.1:

Variables: StoreLen L FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I LRemain
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes L Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = L -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign L (plus (name L) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::(((L, V)::LRemain)::Ctx)) (assign L (plus (name L) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : mem (L, I) [(L, intVal StoreLen), (L, recVal Fields)]
RA : remove_all [(L, recVal Fields)] L LRemain
============================
 []::(((L, V)::LRemain)::Ctx) = []::([(L, V), (L, intVal StoreLen)]::Ctx)
 < apply NEq to _.

Subgoal 1.3.2.1.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I R
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::(((L, V)::((Len, intVal StoreLen)::R))::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)]
RA : Len = L -> false
RA1 : remove_all [(L, recVal Fields)] L R
============================
 []::(((L, V)::((Len, intVal StoreLen)::R))::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < clear RA.

Subgoal 1.3.2.1.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I R
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::(((L, V)::((Len, intVal StoreLen)::R))::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)]
RA1 : remove_all [(L, recVal Fields)] L R
============================
 []::(((L, V)::((Len, intVal StoreLen)::R))::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < RA: case RA1.

Subgoal 1.3.2.1.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I R
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::(((L, V)::((Len, intVal StoreLen)::R))::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)]
RA : remove_all [] L R
============================
 []::(((L, V)::((Len, intVal StoreLen)::R))::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < case RA.

Subgoal 1.3.2.1.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)]
============================
 []::([(L, V), (Len, intVal StoreLen)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < search.

Subgoal 1.3.2.1.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I R1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::(((L, V)::((Len, intVal StoreLen)::((L, recVal Fields)::R1)))::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : mem (L, I) [(Len, intVal StoreLen), (L, recVal Fields)]
RA : L = L -> false
RA1 : remove_all [] L R1
============================
 []::(((L, V)::((Len, intVal StoreLen)::((L, recVal Fields)::R1)))::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < apply RA to _.

Subgoal 1.3.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::New1)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS : no_lookup [(Len, intVal StoreLen), (L, recVal Fields)] L
RS1 : replaceScopes L V Ctx New1
============================
 []::([(Len, intVal StoreLen), (L, recVal Fields)]::New1) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < NL: case RS.

Subgoal 1.3.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::New1)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS1 : replaceScopes L V Ctx New1
NL : Len = L -> false
NL1 : no_lookup [(L, recVal Fields)] L
============================
 []::([(Len, intVal StoreLen), (L, recVal Fields)]::New1) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < NL': case NL1.

Subgoal 1.3.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V New1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::New1)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
RS1 : replaceScopes L V Ctx New1
NL : Len = L -> false
NL' : L = L -> false
NL'1 : no_lookup [] L
============================
 []::([(Len, intVal StoreLen), (L, recVal Fields)]::New1) = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < apply NL' to _.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields EE3 V
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE EE3 (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) EE3
Ev7 : lookup Fields "tail" V
Eq : EE3 = []::([(L, V), (Len, intVal StoreLen)]::Ctx)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Eq.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev6 : replaceScopes L V ([]::([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx)) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx))
Ev7 : lookup Fields "tail" V
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < clear Ev6.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev1 : evalStmt FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (assign Len (plus (name Len) (num 1))) (Scope::EE2) O12 *
Ev7 : lookup Fields "tail" V
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev1.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V V1 EE5
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev : evalExpr FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (plus (name Len) (num 1)) V1 EE5 O12 *
Ev1 : replaceScopes Len V1 EE5 (Scope::EE2)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V EE5 I1 EE6 O6 I2 O7 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) EE5 (Scope::EE2)
Ev : evalExpr FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (name Len) (intVal I1) EE6 O6 *
Ev3 : evalExpr FE EE6 (num 1) (intVal I2) EE5 O7 *
Ev6 : I1 + I2 = I
Ev8 : O6 ++ O7 = O12
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Ev3.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V EE5 I1 O6 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) EE5 (Scope::EE2)
Ev : evalExpr FE ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (name Len) (intVal I1) EE5 O6 *
Ev6 : I1 + 1 = I
Ev8 : O6 ++ [] = O12
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 O12 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
Ev8 : [] ++ [] = O12
Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Ev8.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 O4 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O4 *
Ev4 : [] ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Ev4.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Eq: assert I1 = StoreLen.

Subgoal 1.4:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1)
============================
 I1 = StoreLen
 < LS': case Ev.

Subgoal 1.4.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
LS' : lookup [] Len (intVal I1)
============================
 I1 = StoreLen
 < case LS'.

Subgoal 1.4.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
LS' : no_lookup [] Len
LS'1 : lookupScopes Len ([(L, V), (Len, intVal StoreLen)]::Ctx) (intVal I1)
============================
 I1 = StoreLen
 < clear LS'.

Subgoal 1.4.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
LS'1 : lookupScopes Len ([(L, V), (Len, intVal StoreLen)]::Ctx) (intVal I1)
============================
 I1 = StoreLen
 < LS': case LS'1.

Subgoal 1.4.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
LS' : lookup [(L, V), (Len, intVal StoreLen)] Len (intVal I1)
============================
 I1 = StoreLen
 < L: case LS'.

Subgoal 1.4.2.1.1:

Variables: StoreLen Len FE Ctx Ctx' FinalLen O Scope EE2 Fields I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : Len = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" (intVal I1)
Ev1 : replaceScopes Len (intVal I) ([]::([(Len, intVal I1), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
============================
 I1 = StoreLen
 < apply NEq to _.

Subgoal 1.4.2.1.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
L : L = Len -> false
L1 : lookup [(Len, intVal StoreLen)] Len (intVal I1)
============================
 I1 = StoreLen
 < L': case L1.

Subgoal 1.4.2.1.2.1:

Variables: L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer I1
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal I1)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
L : L = Len -> false
============================
 I1 = I1
 < search.

Subgoal 1.4.2.1.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
L : L = Len -> false
L' : Len = Len -> false
L'1 : lookup [] Len (intVal I1)
============================
 I1 = StoreLen
 < apply L' to _.

Subgoal 1.4.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
LS' : no_lookup [(L, V), (Len, intVal StoreLen)] Len
LS'1 : lookupScopes Len Ctx (intVal I1)
============================
 I1 = StoreLen
 < NL: case LS'.

Subgoal 1.4.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
LS'1 : lookupScopes Len Ctx (intVal I1)
NL : L = Len -> false
NL1 : no_lookup [(Len, intVal StoreLen)] Len
============================
 I1 = StoreLen
 < NL': case NL1.

Subgoal 1.4.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
LS'1 : lookupScopes Len Ctx (intVal I1)
NL : L = Len -> false
NL' : Len = Len -> false
NL'1 : no_lookup [] Len
============================
 I1 = StoreLen
 < apply NL' to _.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I1 I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : I1 + 1 = I
Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal I1)
Eq : I1 = StoreLen
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Eq.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : StoreLen + 1 = I
Ev : lookupScopes Len ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (intVal StoreLen)
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < clear Ev.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : StoreLen + 1 = I
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Eq: assert []::([(Len, intVal I), (L, V)]::Ctx) = Scope::EE2.

Subgoal 1.5:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : StoreLen + 1 = I
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = Scope::EE2
 < R: case Ev1.

Subgoal 1.5.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 LRemain
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(L, V), (Len, intVal StoreLen)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : mem (Len, I3) []
R1 : remove_all [] Len LRemain
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = ((Len, intVal I)::LRemain)::([(L, V), (Len, intVal StoreLen)]::Ctx)
 < case R.

Subgoal 1.5.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O EE2 Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : no_lookup [] Len
R1 : replaceScopes Len (intVal I) ([(L, V), (Len, intVal StoreLen)]::Ctx) EE2
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::EE2
 < clear R.

Subgoal 1.5.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O EE2 Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R1 : replaceScopes Len (intVal I) ([(L, V), (Len, intVal StoreLen)]::Ctx) EE2
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::EE2
 < R: case R1.

Subgoal 1.5.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 LRemain
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE (((Len, intVal I)::LRemain)::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)]
R1 : remove_all [(L, V), (Len, intVal StoreLen)] Len LRemain
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::(((Len, intVal I)::LRemain)::Ctx)
 < RA: case R1.

Subgoal 1.5.2.1.1:

Variables: StoreLen Len FE Ctx Ctx' FinalLen O Fields V I I3 LRemain
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : Len = Len -> false
Ev2 : evalStmt FE (((Len, intVal I)::LRemain)::Ctx) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : mem (Len, I3) [(Len, V), (Len, intVal StoreLen)]
RA : remove_all [(Len, intVal StoreLen)] Len LRemain
============================
 []::([(Len, intVal I), (Len, V)]::Ctx) = []::(((Len, intVal I)::LRemain)::Ctx)
 < apply NEq to _.

Subgoal 1.5.2.1.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 R
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE (((Len, intVal I)::((L, V)::R))::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)]
RA : L = Len -> false
RA1 : remove_all [(Len, intVal StoreLen)] Len R
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::(((Len, intVal I)::((L, V)::R))::Ctx)
 < RA': case RA1.

Subgoal 1.5.2.1.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 R
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE (((Len, intVal I)::((L, V)::R))::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)]
RA : L = Len -> false
RA' : remove_all [] Len R
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::(((Len, intVal I)::((L, V)::R))::Ctx)
 < case RA'.

Subgoal 1.5.2.1.2.1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)]
RA : L = Len -> false
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::([(Len, intVal I), (L, V)]::Ctx)
 < search.

Subgoal 1.5.2.1.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I I3 R1
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE (((Len, intVal I)::((L, V)::((Len, intVal StoreLen)::R1)))::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : mem (Len, I3) [(L, V), (Len, intVal StoreLen)]
RA : L = Len -> false
RA' : Len = Len -> false
RA'1 : remove_all [] Len R1
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::(((Len, intVal I)::((L, V)::((Len, intVal StoreLen)::R1)))::Ctx)
 < apply RA' to _.

Subgoal 1.5.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I New
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(L, V), (Len, intVal StoreLen)]::New) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R : no_lookup [(L, V), (Len, intVal StoreLen)] Len
R1 : replaceScopes Len (intVal I) Ctx New
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::New)
 < NL: case R.

Subgoal 1.5.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I New
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(L, V), (Len, intVal StoreLen)]::New) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R1 : replaceScopes Len (intVal I) Ctx New
NL : L = Len -> false
NL1 : no_lookup [(Len, intVal StoreLen)] Len
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::New)
 < NL': case NL1.

Subgoal 1.5.2.2:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I New
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(L, V), (Len, intVal StoreLen)]::New) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
R1 : replaceScopes Len (intVal I) Ctx New
NL : L = Len -> false
NL' : Len = Len -> false
NL'1 : no_lookup [] Len
============================
 []::([(Len, intVal I), (L, V)]::Ctx) = []::([(L, V), (Len, intVal StoreLen)]::New)
 < apply NL' to _.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Scope EE2 Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE EE2 (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) (Scope::EE2)
Ev6 : StoreLen + 1 = I
Eq : []::([(Len, intVal I), (L, V)]::Ctx) = Scope::EE2
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Eq.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev1 : replaceScopes Len (intVal I) ([]::([(L, V), (Len, intVal StoreLen)]::Ctx)) ([]::([(Len, intVal I), (L, V)]::Ctx))
Ev6 : StoreLen + 1 = I
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < clear Ev1.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < apply plus_integer_is_integer to _ _ Ev6.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Ctx' FinalLen O Fields V I
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
H1 : is_integer I
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Sub: apply IH to Ev2 LS _ NEq.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
H1 : is_integer I
Sub : listLength V CurrLen
Sub1 : is_integer CurrLen
Sub2 : CurrLen + I = TotalLen
============================
 exists Scope TotalLen1 CurrLen,
   (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\
   intVal TotalLen = intVal TotalLen1) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen1
 < P: apply plus_integer_total to Sub1 _ with
        N2 = 1.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen N3
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
H1 : is_integer I
Sub : listLength V CurrLen
Sub1 : is_integer CurrLen
Sub2 : CurrLen + I = TotalLen
P : CurrLen + 1 = N3
============================
 exists Scope TotalLen1 CurrLen,
   (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\
   intVal TotalLen = intVal TotalLen1) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen1
 < apply plus_integer_is_integer to _ _ P.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen N3
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
H1 : is_integer I
Sub : listLength V CurrLen
Sub1 : is_integer CurrLen
Sub2 : CurrLen + I = TotalLen
P : CurrLen + 1 = N3
H2 : is_integer N3
============================
 exists Scope TotalLen1 CurrLen,
   (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\
   intVal TotalLen = intVal TotalLen1) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen1
 < AssocP: apply plus_integer_assoc to _ _ _ Ev6 Sub2.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen N3 Subtotal'
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
H1 : is_integer I
Sub : listLength V CurrLen
Sub1 : is_integer CurrLen
Sub2 : CurrLen + I = TotalLen
P : CurrLen + 1 = N3
H2 : is_integer N3
AssocP : 1 + CurrLen = Subtotal'
AssocP1 : StoreLen + Subtotal' = TotalLen
============================
 exists Scope TotalLen1 CurrLen,
   (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\
   intVal TotalLen = intVal TotalLen1) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen1
 < P': apply plus_integer_comm to _ _ P.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen N3 Subtotal'
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
H1 : is_integer I
Sub : listLength V CurrLen
Sub1 : is_integer CurrLen
Sub2 : CurrLen + I = TotalLen
P : CurrLen + 1 = N3
H2 : is_integer N3
AssocP : 1 + CurrLen = Subtotal'
AssocP1 : StoreLen + Subtotal' = TotalLen
P' : 1 + CurrLen = N3
============================
 exists Scope TotalLen1 CurrLen,
   (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\
   intVal TotalLen = intVal TotalLen1) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen1
 < apply plus_integer_unique to P' AssocP.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen Subtotal'
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
H1 : is_integer I
Sub : listLength V CurrLen
Sub1 : is_integer CurrLen
Sub2 : CurrLen + I = TotalLen
P : CurrLen + 1 = Subtotal'
H2 : is_integer Subtotal'
AssocP : 1 + CurrLen = Subtotal'
AssocP1 : StoreLen + Subtotal' = TotalLen
P' : 1 + CurrLen = Subtotal'
============================
 exists Scope TotalLen1 CurrLen,
   (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\
   intVal TotalLen = intVal TotalLen1) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen1
 < apply plus_integer_comm to _ _ AssocP1.

Subgoal 1:

Variables: StoreLen L Len FE Ctx Fields V I Scope1 TotalLen CurrLen Subtotal'
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len (Scope1::Ctx) (intVal TotalLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev2 : evalStmt FE ([(Len, intVal I), (L, V)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope1::Ctx) [] *
Ev5 : lookup Fields "null" falseVal
Ev7 : lookup Fields "tail" V
Ev6 : StoreLen + 1 = I
H1 : is_integer I
Sub : listLength V CurrLen
Sub1 : is_integer CurrLen
Sub2 : CurrLen + I = TotalLen
P : CurrLen + 1 = Subtotal'
H2 : is_integer Subtotal'
AssocP : 1 + CurrLen = Subtotal'
AssocP1 : StoreLen + Subtotal' = TotalLen
P' : 1 + CurrLen = Subtotal'
H3 : Subtotal' + StoreLen = TotalLen
============================
 exists Scope TotalLen1 CurrLen,
   (((([] = [] /\ Scope1::Ctx = Scope::Ctx) /\
   intVal TotalLen = intVal TotalLen1) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen1
 < search.

Subgoal 2:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (not (recFieldAccess (name L) "null")) falseVal Ctx' O *
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 2:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recFieldAccess (name L) "null") trueVal Ctx' O *
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 2:

Variables: LV StoreLen L Len FE Ctx Ctx' FinalLen O Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len Ctx' FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev : evalExpr FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (name L) (recVal Fields) Ctx' O *
Ev1 : lookup Fields "null" trueVal
============================
 exists Scope TotalLen CurrLen,
   ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Ev: case Ev.

Subgoal 2:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields)
============================
 exists Scope TotalLen CurrLen,
   (((([] = [] /\ [(Len, intVal StoreLen), (L, LV)]::Ctx = Scope::Ctx) /\
   FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Eq: assert LV = recVal Fields.

Subgoal 2.1:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields)
============================
 LV = recVal Fields
 < LS': case Ev.

Subgoal 2.1.1:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
LS' : lookup [(Len, intVal StoreLen), (L, LV)] L (recVal Fields)
============================
 LV = recVal Fields
 < L: case LS'.

Subgoal 2.1.1:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
L : Len = L -> false
L1 : lookup [(L, LV)] L (recVal Fields)
============================
 LV = recVal Fields
 < L': case L1.

Subgoal 2.1.1.1:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
L : Len = L -> false
============================
 recVal Fields = recVal Fields
 < search.

Subgoal 2.1.1.2:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
L : Len = L -> false
L' : L = L -> false
L'1 : lookup [] L (recVal Fields)
============================
 LV = recVal Fields
 < apply L' to _.

Subgoal 2.1.2:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
LS' : no_lookup [(Len, intVal StoreLen), (L, LV)] L
LS'1 : lookupScopes L Ctx (recVal Fields)
============================
 LV = recVal Fields
 < NL: case LS'.

Subgoal 2.1.2:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
LS'1 : lookupScopes L Ctx (recVal Fields)
NL : Len = L -> false
NL1 : no_lookup [(L, LV)] L
============================
 LV = recVal Fields
 < NL': case NL1.

Subgoal 2.1.2:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
LS'1 : lookupScopes L Ctx (recVal Fields)
NL : Len = L -> false
NL' : L = L -> false
NL'1 : no_lookup [] L
============================
 LV = recVal Fields
 < apply NL' to _.

Subgoal 2:

Variables: LV StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, LV)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, LV)]::Ctx) (recVal Fields)
Eq : LV = recVal Fields
============================
 exists Scope TotalLen CurrLen,
   (((([] = [] /\ [(Len, intVal StoreLen), (L, LV)]::Ctx = Scope::Ctx) /\
   FinalLen = intVal TotalLen) /\
   listLength LV CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Eq.

Subgoal 2:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
Ev : lookupScopes L ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (recVal Fields)
============================
 exists Scope TotalLen CurrLen,
   (((([] = [] /\
   [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\
   FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < clear Ev.

Subgoal 2:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
============================
 exists Scope TotalLen CurrLen,
   (((([] = [] /\
   [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\
   FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < Eq: assert FinalLen = intVal StoreLen.

Subgoal 2.2:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
============================
 FinalLen = intVal StoreLen
 < LS: case LS.

Subgoal 2.2.1:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
LS : lookup [(Len, intVal StoreLen), (L, recVal Fields)] Len FinalLen
============================
 FinalLen = intVal StoreLen
 < L: case LS.

Subgoal 2.2.1.1:

Variables: StoreLen L Len FE Ctx Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
============================
 intVal StoreLen = intVal StoreLen
 < search.

Subgoal 2.2.1.2:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
L : Len = Len -> false
L1 : lookup [(L, recVal Fields)] Len FinalLen
============================
 FinalLen = intVal StoreLen
 < apply L to _.

Subgoal 2.2.2:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
LS : no_lookup [(Len, intVal StoreLen), (L, recVal Fields)] Len
LS1 : lookupScopes Len Ctx FinalLen
============================
 FinalLen = intVal StoreLen
 < NL: case LS.

Subgoal 2.2.2:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
LS1 : lookupScopes Len Ctx FinalLen
NL : Len = Len -> false
NL1 : no_lookup [(L, recVal Fields)] Len
============================
 FinalLen = intVal StoreLen
 < apply NL to _.

Subgoal 2:

Variables: StoreLen L Len FE Ctx FinalLen Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) FinalLen
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
Eq : FinalLen = intVal StoreLen
============================
 exists Scope TotalLen CurrLen,
   (((([] = [] /\
   [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\
   FinalLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < case Eq.

Subgoal 2:

Variables: StoreLen L Len FE Ctx Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (intVal StoreLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
============================
 exists Scope TotalLen CurrLen,
   (((([] = [] /\
   [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\
   intVal StoreLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < P: assert 0 + StoreLen = StoreLen.

Subgoal 2:

Variables: StoreLen L Len FE Ctx Fields
IH : forall LV StoreLen L Len FE Ctx Ctx' FinalLen O,
       evalStmt FE ([(Len, intVal StoreLen), (L, LV)]::Ctx) (while (not (recFieldAccess (name L) "null")) (seq (assign L (recFieldAccess (name L) "tail")) (assign Len (plus (name Len) (num 1))))) Ctx' O * ->
       lookupScopes Len Ctx' FinalLen -> is_integer StoreLen -> (L = Len -> false) ->
       exists Scope TotalLen CurrLen,
         ((((O = [] /\ Ctx' = Scope::Ctx) /\ FinalLen = intVal TotalLen) /\
         listLength LV CurrLen) /\
         is_integer CurrLen) /\
         CurrLen + StoreLen = TotalLen
LS : lookupScopes Len ([(Len, intVal StoreLen), (L, recVal Fields)]::Ctx) (intVal StoreLen)
IsSLen : is_integer StoreLen
NEq : L = Len -> false
Ev1 : lookup Fields "null" trueVal
P : 0 + StoreLen = StoreLen
============================
 exists Scope TotalLen CurrLen,
   (((([] = [] /\
   [(Len, intVal StoreLen), (L, recVal Fields)]::Ctx = Scope::Ctx) /\
   intVal StoreLen = intVal TotalLen) /\
   listLength (recVal Fields) CurrLen) /\
   is_integer CurrLen) /\
   CurrLen + StoreLen = TotalLen
 < search.

Proof completed.
 < Extensible_Theorem
      iterateList_dot_null : forall FE EE V X Body EE' O,
         IL : iterateList FE EE V X Body EE' O ->
         exists Fs,
           V = recVal Fs /\
           (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal)
      on IL.

Subgoal 1:

Variables: FE X Body EE' Fields
IH : forall FE EE V X Body EE' O,
       iterateList FE EE V X Body EE' O * -> exists Fs,
         V = recVal Fs /\
         (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal)
IL : iterateList FE EE' (recVal Fields) X Body EE' [] @
IL1 : lookup Fields "null" trueVal
============================
 exists Fs,
   recVal Fields = recVal Fs /\
   (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal)
 < search.

Subgoal 2:

Variables: FE EE X Body EE' O Hd Scope EE3 O2 Tl O3 Fields
IH : forall FE EE V X Body EE' O,
       iterateList FE EE V X Body EE' O * -> exists Fs,
         V = recVal Fs /\
         (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal)
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
============================
 exists Fs,
   recVal Fields = recVal Fs /\
   (lookup Fs "null" trueVal \/ lookup Fs "null" falseVal)
 < search.

Proof completed.
 < Theorem iterateList_to_while :
     forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O.

============================
 forall FE EE V X Body EE' O Names L,
   is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O ->
   names EE Names -> fresh_name "L" (X::Names) L -> exists V',
     evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < induction on 6.

IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
============================
 forall FE EE V X Body EE' O Names L,
   is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O @ ->
   names EE Names -> fresh_name "L" (X::Names) L -> exists V',
     evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < intros IsV IsX IsBody IsFE IsEE IL Names Fr.

Variables: FE EE V X Body EE' O Names L
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE V X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
============================
 exists V',
   evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < Or: apply iterateList_dot_null to IL.

Variables: FE EE X Body EE' O Names L Fs
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsV : is_value (recVal Fs)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fs) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
Or : lookup Fs "null" trueVal \/ lookup Fs "null" falseVal
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < clear Or.

Variables: FE EE X Body EE' O Names L Fs
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsV : is_value (recVal Fs)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fs) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < IL: case IL.

Subgoal 1:

Variables: FE X Body EE' Names L Fs
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsV : is_value (recVal Fs)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" trueVal
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') []
 < search 20.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsV : is_value (recVal Fs)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE3 Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < case IsV.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE3 Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < apply lookup_is_value to _ IL1.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE3 Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < apply lookup_is_value to _ IL3.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE3 Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < IsEE''+: apply evalStmt_isCtx to _ _ _ IL2.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE3 Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < IsEE'': case IsEE''+.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd Scope EE3 O2 Tl O3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE3 Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < NS: apply evalStmt_names_same to _ _ _ IL2.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE''
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < Names'': apply names_exists to IsEE''1.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < IsN: apply names_is to _ Names''.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < Fr': apply fresh_name_exists to _ _ with
          Base = "L" Names = X::N.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
============================
 exists V',
   evalStmt FE ([(L, recVal Fs)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
 < apply fresh_name_unique_mems to Fr Fr' _ _.

Subgoal 2.1:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
============================
 forall X1, mem X1 (X::N) -> mem X1 (X::Names)
 < intros M.

Subgoal 2.1:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
M : mem X1 (X::N)
============================
 mem X1 (X::Names)
 < M: case M.

Subgoal 2.1.1:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
============================
 mem X (X::Names)
 < search.

Subgoal 2.1.2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
M : mem X1 N
============================
 mem X1 (X::Names)
 < NS': apply names_same_symmetric to NS.

Subgoal 2.1.2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
M : mem X1 N
NS' : names_same EE'' EE
============================
 mem X1 (X::Names)
 < apply names_same_names to NS' Names'' Names M.

Subgoal 2.1.2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
M : mem X1 N
NS' : names_same EE'' EE
H4 : mem X1 Names
============================
 mem X1 (X::Names)
 < search.

Subgoal 2.2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
============================
 forall X1, mem X1 (X::Names) -> mem X1 (X::N)
 < intros M.

Subgoal 2.2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
M : mem X1 (X::Names)
============================
 mem X1 (X::N)
 < M: case M.

Subgoal 2.2.1:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
============================
 mem X (X::N)
 < search.

Subgoal 2.2.2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
M : mem X1 Names
============================
 mem X1 (X::N)
 < apply names_same_names to NS Names Names'' M.

Subgoal 2.2.2:

Variables: FE EE X Body EE' O Names L Fs Hd O2 Tl O3 Scope' EE'' N F X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
M : mem X1 Names
H4 : mem X1 N
============================
 mem X1 (X::N)
 < search.

Subgoal 2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
============================
 exists V',
   evalStmt FE ([(F, recVal Fs)]::EE) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O
 < EvSub: apply IH to _ _ _ _ _ IL4 Names'' Fr'.

Subgoal 2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 exists V',
   evalStmt FE ([(F, recVal Fs)]::EE) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O
 < exists V'.

Subgoal 2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 evalStmt FE ([(F, recVal Fs)]::EE) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O
 < unfold .

Subgoal 2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 exists EE1 O1 Scope EE2 O2 O3 O12,
   evalExpr FE ([(F, recVal Fs)]::EE) (not (null (name F))) trueVal EE1 O1 /\
   (evalStmt FE ([]::EE1) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope::EE2) O2 /\
   (evalStmt FE EE2 (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 /\
   (O1 ++ O2 = O12 /\ O12 ++ O3 = O)))
 < exists [(F, recVal Fs)]::EE,
   [],
   Scope'.

Subgoal 2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 exists EE2 O2 O3 O12,
   evalExpr FE ([(F, recVal Fs)]::EE) (not (null (name F))) trueVal ([(F, recVal Fs)]::EE) [] /\
   (evalStmt FE ([]::([(F, recVal Fs)]::EE)) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope'::EE2) O2 /\
   (evalStmt FE EE2 (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 /\
   ([] ++ O2 = O12 /\ O12 ++ O3 = O)))
 < exists [(F, Tl)]::EE'',
   O2,
   O3,
   O2.

Subgoal 2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 evalExpr FE ([(F, recVal Fs)]::EE) (not (null (name F))) trueVal ([(F, recVal Fs)]::EE) [] /\
 (evalStmt FE ([]::([(F, recVal Fs)]::EE)) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope'::([(F, Tl)]::EE'')) O2 /\
 (evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3 /\
 ([] ++ O2 = O2 /\ O2 ++ O3 = O)))
 < split.

Subgoal 2.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 evalExpr FE ([(F, recVal Fs)]::EE) (not (null (name F))) trueVal ([(F, recVal Fs)]::EE) []
 < search.

Subgoal 2.4:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 evalStmt FE ([]::([(F, recVal Fs)]::EE)) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope'::([(F, Tl)]::EE'')) O2
 < unfold .

Subgoal 2.4:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 exists EE1 O1 O3,
   evalStmt FE ([]::([(F, recVal Fs)]::EE)) (declare intTy X (head (name F))) EE1 O1 /\
   (evalStmt FE EE1 (seq (assign F (tail (name F))) Body) (Scope'::([(F, Tl)]::EE'')) O3 /\
   O1 ++ O3 = O2)
 < exists [(X, Hd)]::([(F, recVal Fs)]::EE),
   [],
   O2.

Subgoal 2.4:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 evalStmt FE ([]::([(F, recVal Fs)]::EE)) (declare intTy X (head (name F))) ([(X, Hd)]::([(F, recVal Fs)]::EE)) [] /\
 (evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (seq (assign F (tail (name F))) Body) (Scope'::([(F, Tl)]::EE'')) O2 /\
 [] ++ O2 = O2)
 < split.

Subgoal 2.4.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 evalStmt FE ([]::([(F, recVal Fs)]::EE)) (declare intTy X (head (name F))) ([(X, Hd)]::([(F, recVal Fs)]::EE)) []
 < search 20.

Subgoal 2.4.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (seq (assign F (tail (name F))) Body) (Scope'::([(F, Tl)]::EE'')) O2
 < NEq: assert X = F -> false.

Subgoal 2.4.2.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 X = F -> false
 < intros E.

Subgoal 2.4.2.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
E : X = F
============================
 false
 < case E.

Subgoal 2.4.2.1:

Variables: FE EE Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string F
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (F::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(F, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl F Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (F::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy F (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 false
 < apply fresh_name_not_mem to Fr _.

Subgoal 2.4.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
============================
 evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (seq (assign F (tail (name F))) Body) (Scope'::([(F, Tl)]::EE'')) O2
 < unfold .

Subgoal 2.4.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
============================
 exists EE1 O1 O3,
   evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (assign F (tail (name F))) EE1 O1 /\
   (evalStmt FE EE1 Body (Scope'::([(F, Tl)]::EE'')) O3 /\ O1 ++ O3 = O2)
 < exists [(X, Hd)]::([(F, Tl)]::EE),
   [],
   O2.

Subgoal 2.4.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
============================
 evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (assign F (tail (name F))) ([(X, Hd)]::([(F, Tl)]::EE)) [] /\
 (evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2 /\
 [] ++ O2 = O2)
 < split.

Subgoal 2.4.2.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
============================
 evalStmt FE ([(X, Hd)]::([(F, recVal Fs)]::EE)) (assign F (tail (name F))) ([(X, Hd)]::([(F, Tl)]::EE)) []
 < search 10.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' N1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE N1
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < rename N1 to Len.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < NNS: assert newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE.

Subgoal 2.4.2.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
 < unfold .

Subgoal 2.4.2.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 exists N SNames BNames,
   ((((length EE Len /\ drop N ([(F, Tl)]::EE) EE) /\
   take N ([(F, Tl)]::EE) [[(F, Tl)]]) /\
   names [[(F, Tl)]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [F],
   Names.

Subgoal 2.4.2.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 ((((length EE Len /\ drop 1 ([(F, Tl)]::EE) EE) /\
 take 1 ([(F, Tl)]::EE) [[(F, Tl)]]) /\
 names [[(F, Tl)]] [F]) /\
 names EE Names) /\
 (forall X, mem X [F] -> mem X Names -> false)
 < split.

Subgoal 2.4.2.3.1.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 length EE Len
 < search.

Subgoal 2.4.2.3.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 drop 1 ([(F, Tl)]::EE) EE
 < search.

Subgoal 2.4.2.3.1.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 take 1 ([(F, Tl)]::EE) [[(F, Tl)]]
 < search.

Subgoal 2.4.2.3.1.4:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 names [[(F, Tl)]] [F]
 < search.

Subgoal 2.4.2.3.1.5:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 names EE Names
 < search.

Subgoal 2.4.2.3.1.6:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
============================
 forall X, mem X [F] -> mem X Names -> false
 < intros M MN.

Subgoal 2.4.2.3.1.6:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
M : mem X1 [F]
MN : mem X1 Names
============================
 false
 < M: case M.

Subgoal 2.4.2.3.1.6.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
MN : mem F Names
============================
 false
 < apply fresh_name_not_mem to Fr _.

Subgoal 2.4.2.3.1.6.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
MN : mem X1 Names
M : mem X1 []
============================
 false
 < case M.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < apply fresh_name_is to _ Fr.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Ev: apply evalStmt_newNameScopes_exists to _ _ _ _ IL2 NNS.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len EE_A'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body EE_A' O2
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < NNS': apply evalStmt_newNameScopes to _ _ _ _ Ev IL2 _.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len EE_A'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body EE_A' O2
NNS' : newNameScopes [[(F, Tl)]] Len EE_A' (Scope'::EE'')
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < NNS': case NNS'.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len EE_A' N1 SNames BNames
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body EE_A' O2
NNS' : length (Scope'::EE'') Len
NNS'1 : drop N1 EE_A' (Scope'::EE'')
NNS'2 : take N1 EE_A' [[(F, Tl)]]
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Take: case NNS'2.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len N1 SNames BNames N2 L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2
NNS' : length (Scope'::EE'') Len
NNS'1 : drop N1 ([(F, Tl)]::L1) (Scope'::EE'')
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 L1 []
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < case Take1.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len N1 SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2
NNS' : length (Scope'::EE'') Len
NNS'1 : drop N1 ([(F, Tl)]::L1) (Scope'::EE'')
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < compute Take.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2
NNS' : length (Scope'::EE'') Len
NNS'1 : drop 1 ([(F, Tl)]::L1) (Scope'::EE'')
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Drop: case NNS'1.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 N3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 L1 (Scope'::EE'')
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < apply drop_is_integer to Drop1.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 N3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 L1 (Scope'::EE'')
H5 : is_integer N3
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 (Scope'::EE'')
H5 : is_integer 0
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Eq: assert L1 = Scope'::EE''.

Subgoal 2.4.2.3.2.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 (Scope'::EE'')
H5 : is_integer 0
============================
 L1 = Scope'::EE''
 < D: case Drop1.

Subgoal 2.4.2.3.2.1.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
============================
 Scope'::EE'' = Scope'::EE''
 < search.

Subgoal 2.4.2.3.2.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 (Scope'::EE'')
============================
 X1::L2 = Scope'::EE''
 < apply drop_is_integer to D1.

Subgoal 2.4.2.3.2.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 (Scope'::EE'')
H6 : is_integer N4
============================
 X1::L2 = Scope'::EE''
 < P: assert 1 + -1 = 0.

Subgoal 2.4.2.3.2.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 (Scope'::EE'')
H6 : is_integer N4
P : 1 + -1 = 0
============================
 X1::L2 = Scope'::EE''
 < apply plus_integer_unique_addend to _ _ _ P D.

Subgoal 2.4.2.3.2.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 (Scope'::EE'')
H6 : is_integer -1
P : 1 + -1 = 0
============================
 X1::L2 = Scope'::EE''
 < GEq: apply drop_geq_0 to D1.

Subgoal 2.4.2.3.2.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 (Scope'::EE'')
H6 : is_integer -1
P : 1 + -1 = 0
GEq : -1 >= 0
============================
 X1::L2 = Scope'::EE''
 < LEq: case GEq.

Subgoal 2.4.2.3.2.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(X1::L2)) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 (Scope'::EE'')
H6 : is_integer -1
P : 1 + -1 = 0
LEq : 0 <= -1
============================
 X1::L2 = Scope'::EE''
 < case LEq.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::L1) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 (Scope'::EE'')
H5 : is_integer 0
Eq : L1 = Scope'::EE''
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < case Eq.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 (Scope'::EE'') (Scope'::EE'')
H5 : is_integer 0
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < clear Take
   Drop
   Drop1.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2
NNS' : length (Scope'::EE'') Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H5 : is_integer 0
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Len: case NNS'.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H5 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = Len
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < apply length_is to Len.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H5 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = Len
H6 : is_integer N'
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < L: apply lt_plus_one to Len1 _.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H5 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = Len
H6 : is_integer N'
L : N' < Len
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Len'': apply names_same_length to NS LenEE.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H5 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = Len
H6 : is_integer N'
L : N' < Len
Len'' : length EE'' Len
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < apply length_unique to Len'' Len.

Subgoal 2.4.2.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' SNames BNames N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE N'
NNS : newNameScopes [[(F, Tl)]] N' ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body ([(F, Tl)]::(Scope'::EE'')) O2
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names (Scope'::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H5 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = N'
H6 : is_integer N'
L : N' < N'
Len'' : length EE'' N'
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < apply less_integer_not_eq to L.

Subgoal 2.4.2.3.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len AR
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::AR) O2
NNS' : newNameScopes [[(F, Tl)]] Len AR EE''
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < NNS': case NNS'.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len AR N1 SNames BNames
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::AR) O2
NNS' : length EE'' Len
NNS'1 : drop N1 AR EE''
NNS'2 : take N1 AR [[(F, Tl)]]
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Take: case NNS'2.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len N1 SNames BNames N2 L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2
NNS' : length EE'' Len
NNS'1 : drop N1 ([(F, Tl)]::L1) EE''
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 L1 []
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < case Take1.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len N1 SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2
NNS' : length EE'' Len
NNS'1 : drop N1 ([(F, Tl)]::L1) EE''
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < compute Take.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2
NNS' : length EE'' Len
NNS'1 : drop 1 ([(F, Tl)]::L1) EE''
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Drop: case NNS'1.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 N3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 L1 EE''
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < apply drop_is_integer to Drop1.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1 N3
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 L1 EE''
H5 : is_integer N3
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE''
H5 : is_integer 0
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Eq: assert L1 = EE''.

Subgoal 2.4.2.3.3.1.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE''
H5 : is_integer 0
============================
 L1 = EE''
 < D: case Drop1.

Subgoal 2.4.2.3.3.1.1.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
============================
 EE'' = EE''
 < search.

Subgoal 2.4.2.3.3.1.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 EE''
============================
 X1::L2 = EE''
 < P: assert 1 + -1 = 0.

Subgoal 2.4.2.3.3.1.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 EE''
P : 1 + -1 = 0
============================
 X1::L2 = EE''
 < apply drop_is_integer to D1.

Subgoal 2.4.2.3.3.1.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames N4 L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 EE''
P : 1 + -1 = 0
H6 : is_integer N4
============================
 X1::L2 = EE''
 < apply plus_integer_unique_addend to _ _ _ D P.

Subgoal 2.4.2.3.3.1.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE''
P : 1 + -1 = 0
H6 : is_integer -1
============================
 X1::L2 = EE''
 < GEq: apply drop_geq_0 to D1.

Subgoal 2.4.2.3.3.1.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE''
P : 1 + -1 = 0
H6 : is_integer -1
GEq : -1 >= 0
============================
 X1::L2 = EE''
 < LEq: case GEq.

Subgoal 2.4.2.3.3.1.1.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L2 X1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(X1::L2))) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE''
P : 1 + -1 = 0
H6 : is_integer -1
LEq : 0 <= -1
============================
 X1::L2 = EE''
 < case LEq.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames L1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::L1)) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE''
H5 : is_integer 0
Eq : L1 = EE''
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < case Eq.

Subgoal 2.4.2.3.3.1:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V' Len SNames BNames
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
NNS' : length EE'' Len
NNS'3 : names [[(F, Tl)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE'' EE''
H5 : is_integer 0
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < search.

Subgoal 2.4.2.3.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR)
NS : names_same EE (S::BR)
Names'' : names (S::BR) N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2
NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
 < LenBR+: apply names_same_length to NS LenEE.

Subgoal 2.4.2.3.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR)
NS : names_same EE (S::BR)
Names'' : names (S::BR) N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2
NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR
LenBR+ : length (S::BR) Len
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
 < LenBR: case LenBR+.

Subgoal 2.4.2.3.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR)
NS : names_same EE (S::BR)
Names'' : names (S::BR) N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2
NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
 < apply length_is to LenBR.

Subgoal 2.4.2.3.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR)
NS : names_same EE (S::BR)
Names'' : names (S::BR) N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2
NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H5 : is_integer N'
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 2.4.2.3.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR)
NS : names_same EE (S::BR)
Names'' : names (S::BR) N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2
NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H5 : is_integer N'
L : N' < Len
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 2.4.2.3.3.2:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' N F V' Len BR S AR1 N'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) (S::BR)
NS : names_same EE (S::BR)
Names'' : names (S::BR) N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::(S::BR)) (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
LenEE : length EE Len
NNS : newNameScopes [[(F, Tl)]] Len ([(F, Tl)]::EE) EE
H4 : is_string F
Ev : evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::(S::AR1)) O2
NNS' : newNameScopes [[(F, Tl)]] Len AR1 BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H5 : is_integer N'
L : N' < Len
LEq : Len <= N'
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::(S::BR))) O2
 < apply less_lesseq_flip_false to L LEq.

Subgoal 2.4.2.4:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
NEq : X = F -> false
============================
 [] ++ O2 = O2
 < search.

Subgoal 2.4.3:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 [] ++ O2 = O2
 < search.

Subgoal 2.5:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
 < search.

Subgoal 2.6:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 [] ++ O2 = O2
 < search.

Subgoal 2.7:

Variables: FE EE X Body EE' O Names Fs Hd O2 Tl O3 Scope' EE'' N F V'
IH : forall FE EE V X Body EE' O Names L,
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
       names EE Names -> fresh_name "L" (X::Names) L -> exists V',
         evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) ([(L, V')]::EE') O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL : lookup Fs "null" falseVal
IL1 : lookup Fs "head" Hd
IL2 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL3 : lookup Fs "tail" Tl
IL4 : iterateList FE EE'' Tl X Body EE' O3 *
IL5 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fs
H2 : is_value Hd
H3 : is_value Tl
IsEE'' : is_list (is_pair is_string is_value) Scope'
IsEE''1 : is_list (is_list (is_pair is_string is_value)) EE''
NS : names_same EE EE''
Names'' : names EE'' N
IsN : is_list is_string N
Fr' : fresh_name "L" (X::N) F
EvSub : evalStmt FE ([(F, Tl)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) ([(F, V')]::EE') O3
============================
 O2 ++ O3 = O
 < search.

Proof completed.
 < Theorem while_to_iterateList :
     forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O ->
       iterateList FE EE V X Body EE' O.

============================
 forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
   is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
   names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
   evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O ->
   iterateList FE EE V X Body EE' O
 < induction on 11.

IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
============================
 forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
   is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
   names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
   evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O @ ->
   iterateList FE EE V X Body EE' O
 < intros IsV IsX IsBody IsFE IsEE IsCtx Names Fr CN BN Ev.

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev : evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O @
============================
 iterateList FE EE V X Body EE' O
 < Ev: case Ev.

Subgoal 1:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' EE2 O2 Scope EE4 O3 O4 O12
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev : evalExpr FE ([(L, V)]::EE) (not (null (name L))) trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
============================
 iterateList FE EE V X Body EE' O
 < Ev: case Ev.

Subgoal 1:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' EE2 O2 Scope EE4 O3 O4 O12
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::EE2) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev : evalExpr FE ([(L, V)]::EE) (null (name L)) falseVal EE2 O2 *
============================
 iterateList FE EE V X Body EE' O
 < Ev: case Ev.

Subgoal 1:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' EE2 O2 Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::EE2) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev : evalExpr FE ([(L, V)]::EE) (name L) (recVal Fields) EE2 O2 *
Ev5 : lookup Fields "null" falseVal
============================
 iterateList FE EE V X Body EE' O
 < Ev: case Ev.

Subgoal 1:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, V)]::EE) (recVal Fields)
============================
 iterateList FE EE V X Body EE' O
 < Eq: assert V = recVal Fields.

Subgoal 1.1:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, V)]::EE) (recVal Fields)
============================
 V = recVal Fields
 < L: case Ev.

Subgoal 1.1.1:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
L : lookup [(L, V)] L (recVal Fields)
============================
 V = recVal Fields
 < L: case L.

Subgoal 1.1.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, recVal Fields)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
============================
 recVal Fields = recVal Fields
 < search.

Subgoal 1.1.1.2:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
L : L = L -> false
L1 : lookup [] L (recVal Fields)
============================
 V = recVal Fields
 < case L1.

Subgoal 1.1.2:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
L : no_lookup [(L, V)] L
L1 : lookupScopes L EE (recVal Fields)
============================
 V = recVal Fields
 < NL: case L.

Subgoal 1.1.2:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
L1 : lookupScopes L EE (recVal Fields)
NL : L = L -> false
NL1 : no_lookup [] L
============================
 V = recVal Fields
 < apply NL to _.

Subgoal 1:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, V)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, V)]::EE) (recVal Fields)
Eq : V = recVal Fields
============================
 iterateList FE EE V X Body EE' O
 < case Eq.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O3 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, recVal Fields)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev3 : [] ++ O3 = O12
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Ev3.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : evalStmt FE ([]::([(L, recVal Fields)]::EE)) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body)) (Scope::EE4) O12 *
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Ev: case Ev1.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields EE1 O1 O5
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev1 : evalStmt FE ([]::([(L, recVal Fields)]::EE)) (declare intTy X (head (name L))) EE1 O1 *
Ev3 : evalStmt FE EE1 (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : O1 ++ O5 = O12
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Ev: case Ev1.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O1 O5 EE5 Scope1 V1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE (((X, V1)::Scope1)::EE5) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : O1 ++ O5 = O12
Ev1 : evalExpr FE ([]::([(L, recVal Fields)]::EE)) (head (name L)) V1 (Scope1::EE5) O1 *
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Ev: case Ev1.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O1 O5 EE5 Scope1 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE (((X, V1)::Scope1)::EE5) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : O1 ++ O5 = O12
Ev1 : evalExpr FE ([]::([(L, recVal Fields)]::EE)) (name L) (recVal Fields1) (Scope1::EE5) O1 *
Ev7 : lookup Fields1 "head" V1
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Ev: case Ev1.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields1)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Eq: assert Fields1 = Fields.

Subgoal 1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields1)
============================
 Fields1 = Fields
 < LS: case Ev1.

Subgoal 1.2.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
LS : lookup [] L (recVal Fields1)
============================
 Fields1 = Fields
 < case LS.

Subgoal 1.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
LS : no_lookup [] L
LS1 : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields1)
============================
 Fields1 = Fields
 < LS': case LS1.

Subgoal 1.2.2.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
LS : no_lookup [] L
LS' : lookup [(L, recVal Fields)] L (recVal Fields1)
============================
 Fields1 = Fields
 < L: case LS'.

Subgoal 1.2.2.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields1)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields1 "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields1)]::EE) (recVal Fields1)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields1)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
LS : no_lookup [] L
============================
 Fields1 = Fields1
 < search.

Subgoal 1.2.2.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
LS : no_lookup [] L
L : L = L -> false
L1 : lookup [] L (recVal Fields1)
============================
 Fields1 = Fields
 < apply L to _.

Subgoal 1.2.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
LS : no_lookup [] L
LS' : no_lookup [(L, recVal Fields)] L
LS'1 : lookupScopes L EE (recVal Fields1)
============================
 Fields1 = Fields
 < NL: case LS'.

Subgoal 1.2.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
LS : no_lookup [] L
LS'1 : lookupScopes L EE (recVal Fields1)
NL : L = L -> false
NL1 : no_lookup [] L
============================
 Fields1 = Fields
 < apply NL to _.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1 Fields1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields1 "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields1)
Eq : Fields1 = Fields
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Eq.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields O5 V1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O5 *
Ev6 : [] ++ O5 = O12
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Ev6.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (seq (assign L (tail (name L))) Body) (Scope::EE4) O12 *
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Ev: case Ev3.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 O6 O7
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev3 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (assign L (tail (name L))) EE3 O6 *
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O7 *
Ev8 : O6 ++ O7 = O12
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Ev: case Ev3.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 O6 O7 V2 EE6
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O7 *
Ev8 : O6 ++ O7 = O12
Ev3 : evalExpr FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (tail (name L)) V2 EE6 O6 *
Ev9 : replaceScopes L V2 EE6 EE3
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Ev: case Ev3.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 O6 O7 V2 EE6 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O7 *
Ev8 : O6 ++ O7 = O12
Ev9 : replaceScopes L V2 EE6 EE3
Ev3 : evalExpr FE ([(X, V1)]::([(L, recVal Fields)]::EE)) (name L) (recVal Fields2) EE6 O6 *
Ev10 : lookup Fields2 "tail" V2
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Ev: case Ev3.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 O7 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O7 *
Ev8 : [] ++ O7 = O12
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields2)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Ev8.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields2)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Eq: assert Fields2 = Fields.

Subgoal 1.3:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields2)
============================
 Fields2 = Fields
 < LS: case Ev3.

Subgoal 1.3.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
LS : lookup [(X, V1)] L (recVal Fields2)
============================
 Fields2 = Fields
 < L: case LS.

Subgoal 1.3.1.1:

Variables: FE EE Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string L
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (L::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([L]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy L (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" (recVal Fields2)
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(L, recVal Fields2)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
============================
 Fields2 = Fields
 < apply fresh_name_not_mem to Fr _.

Subgoal 1.3.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
L : X = L -> false
L1 : lookup [] L (recVal Fields2)
============================
 Fields2 = Fields
 < case L1.

Subgoal 1.3.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
LS : no_lookup [(X, V1)] L
LS1 : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields2)
============================
 Fields2 = Fields
 < LS': case LS1.

Subgoal 1.3.2.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
LS : no_lookup [(X, V1)] L
LS' : lookup [(L, recVal Fields)] L (recVal Fields2)
============================
 Fields2 = Fields
 < L: case LS'.

Subgoal 1.3.2.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields2)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields2 "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields2)]::EE) (recVal Fields2)
Ev7 : lookup Fields2 "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields2)]::EE)) (recVal Fields2)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields2)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
LS : no_lookup [(X, V1)] L
============================
 Fields2 = Fields2
 < search.

Subgoal 1.3.2.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
LS : no_lookup [(X, V1)] L
L : L = L -> false
L1 : lookup [] L (recVal Fields2)
============================
 Fields2 = Fields
 < apply L to _.

Subgoal 1.3.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
LS : no_lookup [(X, V1)] L
LS' : no_lookup [(L, recVal Fields)] L
LS'1 : lookupScopes L EE (recVal Fields2)
============================
 Fields2 = Fields
 < NL: case LS'.

Subgoal 1.3.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
LS : no_lookup [(X, V1)] L
LS'1 : lookupScopes L EE (recVal Fields2)
NL : L = L -> false
NL1 : no_lookup [] L
============================
 Fields2 = Fields
 < apply NL to _.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2 Fields2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields2 "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields2)
Eq : Fields2 = Fields
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Eq.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Eq: assert EE3 = [(X, V1)]::([(L, V2)]::EE).

Subgoal 1.4:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
============================
 EE3 = [(X, V1)]::([(L, V2)]::EE)
 < RS: case Ev9.

Subgoal 1.4.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I LRemain
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE (((L, V2)::LRemain)::([(L, recVal Fields)]::EE)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS : mem (L, I) [(X, V1)]
RS1 : remove_all [(X, V1)] L LRemain
============================
 ((L, V2)::LRemain)::([(L, recVal Fields)]::EE) = [(X, V1)]::([(L, V2)]::EE)
 < M: case RS.

Subgoal 1.4.1.1:

Variables: FE EE X Body Scope' EE' O Names Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 LRemain
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) X
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name X))) (seq (declare intTy X (head (name X))) (seq (assign X (tail (name X))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes X ([(X, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes X ([]::([(X, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE (((X, V2)::LRemain)::([(X, recVal Fields)]::EE)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes X ([(X, V1)]::([(X, recVal Fields)]::EE)) (recVal Fields)
RS1 : remove_all [(X, V1)] X LRemain
============================
 ((X, V2)::LRemain)::([(X, recVal Fields)]::EE) = [(X, V1)]::([(X, V2)]::EE)
 < apply fresh_name_not_mem to Fr _.

Subgoal 1.4.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I LRemain
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE (((L, V2)::LRemain)::([(L, recVal Fields)]::EE)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS1 : remove_all [(X, V1)] L LRemain
M : mem (L, I) []
============================
 ((L, V2)::LRemain)::([(L, recVal Fields)]::EE) = [(X, V1)]::([(L, V2)]::EE)
 < case M.

Subgoal 1.4.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 New
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::New) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS : no_lookup [(X, V1)] L
RS1 : replaceScopes L V2 ([(L, recVal Fields)]::EE) New
============================
 [(X, V1)]::New = [(X, V1)]::([(L, V2)]::EE)
 < RS': case RS1.

Subgoal 1.4.2.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I LRemain
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::(((L, V2)::LRemain)::EE)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS : no_lookup [(X, V1)] L
RS' : mem (L, I) [(L, recVal Fields)]
RS'1 : remove_all [(L, recVal Fields)] L LRemain
============================
 [(X, V1)]::(((L, V2)::LRemain)::EE) = [(X, V1)]::([(L, V2)]::EE)
 < RA: case RS'1.

Subgoal 1.4.2.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I LRemain
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::(((L, V2)::LRemain)::EE)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS : no_lookup [(X, V1)] L
RS' : mem (L, I) [(L, recVal Fields)]
RA : remove_all [] L LRemain
============================
 [(X, V1)]::(((L, V2)::LRemain)::EE) = [(X, V1)]::([(L, V2)]::EE)
 < case RA.

Subgoal 1.4.2.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS : no_lookup [(X, V1)] L
RS' : mem (L, I) [(L, recVal Fields)]
============================
 [(X, V1)]::([(L, V2)]::EE) = [(X, V1)]::([(L, V2)]::EE)
 < search.

Subgoal 1.4.2.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 I R
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::(((L, V2)::((L, recVal Fields)::R))::EE)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS : no_lookup [(X, V1)] L
RS' : mem (L, I) [(L, recVal Fields)]
RA : L = L -> false
RA1 : remove_all [] L R
============================
 [(X, V1)]::(((L, V2)::((L, recVal Fields)::R))::EE) = [(X, V1)]::([(L, V2)]::EE)
 < apply RA to _.

Subgoal 1.4.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 New1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::New1)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS : no_lookup [(X, V1)] L
RS' : no_lookup [(L, recVal Fields)] L
RS'1 : replaceScopes L V2 EE New1
============================
 [(X, V1)]::([(L, recVal Fields)]::New1) = [(X, V1)]::([(L, V2)]::EE)
 < NL: case RS'.

Subgoal 1.4.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 New1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, recVal Fields)]::New1)) Body (Scope::EE4) O12 *
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
RS : no_lookup [(X, V1)] L
RS'1 : replaceScopes L V2 EE New1
NL : L = L -> false
NL1 : no_lookup [] L
============================
 [(X, V1)]::([(L, recVal Fields)]::New1) = [(X, V1)]::([(L, V2)]::EE)
 < apply NL to _.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 EE3 V2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE EE3 Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) EE3
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Eq : EE3 = [(X, V1)]::([(L, V2)]::EE)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Eq.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Len: apply length_exists_list_pair_string_value to IsEE.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < NNS: assert newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE.

Subgoal 1.5:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
 < unfold .

Subgoal 1.5:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 exists N1 SNames BNames,
   ((((length EE N /\ drop N1 ([(L, V2)]::EE) EE) /\
   take N1 ([(L, V2)]::EE) [[(L, V2)]]) /\
   names [[(L, V2)]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [L],
   Names.

Subgoal 1.5:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 ((((length EE N /\ drop 1 ([(L, V2)]::EE) EE) /\
 take 1 ([(L, V2)]::EE) [[(L, V2)]]) /\
 names [[(L, V2)]] [L]) /\
 names EE Names) /\
 (forall X, mem X [L] -> mem X Names -> false)
 < split.

Subgoal 1.5.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 length EE N
 < search.

Subgoal 1.5.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 drop 1 ([(L, V2)]::EE) EE
 < search.

Subgoal 1.5.3:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 take 1 ([(L, V2)]::EE) [[(L, V2)]]
 < search.

Subgoal 1.5.4:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 names [[(L, V2)]] [L]
 < search.

Subgoal 1.5.5:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 names EE Names
 < search.

Subgoal 1.5.6:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
============================
 forall X, mem X [L] -> mem X Names -> false
 < intros M MN.

Subgoal 1.5.6:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
M : mem X1 [L]
MN : mem X1 Names
============================
 false
 < M: case M.

Subgoal 1.5.6.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
MN : mem L Names
============================
 false
 < apply fresh_name_not_mem to Fr _.

Subgoal 1.5.6.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
MN : mem X1 Names
M : mem X1 []
============================
 false
 < case M.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < assert ctx_names ([(X, V1)]::EE) ([X]::Ctx).

Subgoal 1.6:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
============================
 ctx_names ([(X, V1)]::EE) ([X]::Ctx)
 < unfold .

Subgoal 1.6.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
============================
 forall K I, mem (K, I) [(X, V1)] -> mem K [X]
 < intros M.

Subgoal 1.6.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N K I
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
M : mem (K, I) [(X, V1)]
============================
 mem K [X]
 < M: case M.

Subgoal 1.6.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
============================
 mem X [X]
 < search.

Subgoal 1.6.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N K I
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
M : mem (K, I) []
============================
 mem K [X]
 < case M.

Subgoal 1.6.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
============================
 forall K, mem K [X] -> exists I, mem (K, I) [(X, V1)]
 < intros M.

Subgoal 1.6.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N K
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
M : mem K [X]
============================
 exists I, mem (K, I) [(X, V1)]
 < M: case M.

Subgoal 1.6.2.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
============================
 exists I, mem (X, I) [(X, V1)]
 < search.

Subgoal 1.6.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N K
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
M : mem K []
============================
 exists I, mem (K, I) [(X, V1)]
 < case M.

Subgoal 1.6.3:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
============================
 ctx_names EE Ctx
 < search.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply fresh_name_is to _ Fr.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < IsR: apply lookupScopes_is to _ Ev.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR : is_value (recVal Fields)
IsR1 : is_string L
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case IsR.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply lookup_is_value to _ Ev7.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply lookup_is_value to _ Ev10.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < EvB: apply evalStmt_newNameScopes_exists_back to _ _ _ _ _ _ BN Ev6 NNS.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N EE_B'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < NNS': apply evalStmt_newNameScopes to _ _ _ _ Ev6 EvB NNS.

Subgoal 1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N EE_B'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : newNameScopes [[(L, V2)]] N (Scope::EE4) EE_B'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < NNS': case NNS'.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N EE_B' N1 SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'1 : drop N1 (Scope::EE4) EE_B'
NNS'2 : take N1 (Scope::EE4) [[(L, V2)]]
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Take: case NNS'2.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' N1 SNames BNames N2
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'1 : drop N1 ([(L, V2)]::EE4) EE_B'
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 EE4 []
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Take1.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' N1 SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'1 : drop N1 ([(L, V2)]::EE4) EE_B'
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < compute Take.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'1 : drop 1 ([(L, V2)]::EE4) EE_B'
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Drop: case NNS'1.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames N3
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 EE4 EE_B'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply drop_is_integer to Drop1.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames N3
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 EE4 EE_B'
H6 : is_integer N3
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE4 EE_B'
H6 : is_integer 0
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Eq: assert EE4 = EE_B'.

Subgoal 1.7.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE4 EE_B'
H6 : is_integer 0
============================
 EE4 = EE_B'
 < D: case Drop1.

Subgoal 1.7.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE_B' (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE_B') O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
============================
 EE_B' = EE_B'
 < search.

Subgoal 1.7.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames N4 L1 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L1 EE_B'
============================
 X1::L1 = EE_B'
 < apply drop_is_integer to D1.

Subgoal 1.7.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames N4 L1 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L1 EE_B'
H7 : is_integer N4
============================
 X1::L1 = EE_B'
 < P: assert 1 + -1 = 0.

Subgoal 1.7.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames N4 L1 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L1 EE_B'
H7 : is_integer N4
P : 1 + -1 = 0
============================
 X1::L1 = EE_B'
 < apply plus_integer_unique_addend to _ _ _ P D.

Subgoal 1.7.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames L1 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L1 EE_B'
H7 : is_integer -1
P : 1 + -1 = 0
============================
 X1::L1 = EE_B'
 < GEq: apply drop_geq_0 to D1.

Subgoal 1.7.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames L1 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L1 EE_B'
H7 : is_integer -1
P : 1 + -1 = 0
GEq : -1 >= 0
============================
 X1::L1 = EE_B'
 < LEq: case GEq.

Subgoal 1.7.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames L1 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (X1::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(X1::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L1 EE_B'
H7 : is_integer -1
P : 1 + -1 = 0
LEq : 0 <= -1
============================
 X1::L1 = EE_B'
 < case LEq.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' EE4 O4 O12 Fields V1 V2 N EE_B' SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE4 EE_B'
H6 : is_integer 0
Eq : EE4 = EE_B'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Eq.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE_B' (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE_B') O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE_B' EE_B'
H6 : is_integer 0
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < clear Take
   Drop
   Drop1.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N EE_B' SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE_B' (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::EE_B') O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body EE_B' O12
NNS' : length EE_B' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < NS: apply evalStmt_names_same to _ _ _ EvB.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N SNames BNames Scope'1 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12
NNS' : length (Scope'1::EE'') N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names (Scope'1::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
NS : names_same EE EE''
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < LenEE'': apply names_same_length to NS Len.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N SNames BNames Scope'1 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12
NNS' : length (Scope'1::EE'') N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names (Scope'1::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
NS : names_same EE EE''
LenEE'' : length EE'' N
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < LenNNS: case NNS'.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N SNames BNames Scope'1 EE'' N'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names (Scope'1::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
NS : names_same EE EE''
LenEE'' : length EE'' N
LenNNS : length EE'' N'
LenNNS1 : 1 + N' = N
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply length_unique to LenEE'' LenNNS.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 SNames BNames Scope'1 EE'' N'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N'
NNS : newNameScopes [[(L, V2)]] N' ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names (Scope'1::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
NS : names_same EE EE''
LenEE'' : length EE'' N'
LenNNS : length EE'' N'
LenNNS1 : 1 + N' = N'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply length_is to LenEE''.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 SNames BNames Scope'1 EE'' N'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N'
NNS : newNameScopes [[(L, V2)]] N' ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names (Scope'1::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
NS : names_same EE EE''
LenEE'' : length EE'' N'
LenNNS : length EE'' N'
LenNNS1 : 1 + N' = N'
H7 : is_integer N'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < L: apply lt_plus_one to LenNNS1 _.

Subgoal 1.7:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 SNames BNames Scope'1 EE'' N'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (Scope'1::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body ([(L, V2)]::(Scope'1::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N'
NNS : newNameScopes [[(L, V2)]] N' ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::EE'') O12
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names (Scope'1::EE'') BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
NS : names_same EE EE''
LenEE'' : length EE'' N'
LenNNS : length EE'' N'
LenNNS1 : 1 + N' = N'
H7 : is_integer N'
L : N' < N'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply less_integer_not_eq to L.

Subgoal 1.8:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N BR
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : newNameScopes [[(L, V2)]] N EE4 BR
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < NNS': case NNS'.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope EE4 O4 O12 Fields V1 V2 N BR N1 SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE EE4 (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::EE4) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'1 : drop N1 EE4 BR
NNS'2 : take N1 EE4 [[(L, V2)]]
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Take: case NNS'2.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR N1 SNames BNames N2 L1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'1 : drop N1 ([(L, V2)]::L1) BR
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 L1 []
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Take1.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR N1 SNames BNames L1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'1 : drop N1 ([(L, V2)]::L1) BR
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < compute Take.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'1 : drop 1 ([(L, V2)]::L1) BR
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Drop: case NNS'1.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1 N3
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 L1 BR
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply drop_is_integer to Drop1.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1 N3
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 L1 BR
H6 : is_integer N3
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 BR
H6 : is_integer 0
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Eq: assert L1 = BR.

Subgoal 1.8.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 BR
H6 : is_integer 0
============================
 L1 = BR
 < D: case Drop1.

Subgoal 1.8.1.1.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
============================
 BR = BR
 < search.

Subgoal 1.8.1.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames N4 L2 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 BR
============================
 X1::L2 = BR
 < apply drop_is_integer to D1.

Subgoal 1.8.1.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames N4 L2 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 BR
H7 : is_integer N4
============================
 X1::L2 = BR
 < P: assert 1 + -1 = 0.

Subgoal 1.8.1.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames N4 L2 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 BR
H7 : is_integer N4
P : 1 + -1 = 0
============================
 X1::L2 = BR
 < apply plus_integer_unique_addend to _ _ _ P D.

Subgoal 1.8.1.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L2 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 BR
H7 : is_integer -1
P : 1 + -1 = 0
============================
 X1::L2 = BR
 < GEq: apply drop_geq_0 to D1.

Subgoal 1.8.1.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L2 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 BR
H7 : is_integer -1
P : 1 + -1 = 0
GEq : -1 >= 0
============================
 X1::L2 = BR
 < LEq: case GEq.

Subgoal 1.8.1.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L2 X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::(X1::L2)) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::(X1::L2))) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 BR
H7 : is_integer -1
P : 1 + -1 = 0
LEq : 0 <= -1
============================
 X1::L2 = BR
 < case LEq.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames L1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::L1) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::L1)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 BR
H6 : is_integer 0
Eq : L1 = BR
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < case Eq.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 BR BR
H6 : is_integer 0
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < clear Take
   Drop
   Drop1.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < CN': apply evalStmt_ctx_names to _ _ _ _ _ BN EvB.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR SNames BNames
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
CN' : ctx_names (Scope::BR) Ctx'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply stmtNames_keep_older to _ _ BN.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
CN' : ctx_names (Scope::BR) (Scope'1::Ctx)
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < CN': case CN'.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope
CN'2 : ctx_names BR Ctx
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < IsBR+: apply evalStmt_isCtx to _ _ _ EvB.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope
CN'2 : ctx_names BR Ctx
IsBR+ : is_list (is_list (is_pair is_string is_value)) (Scope::BR)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < IsBR: case IsBR+.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope
CN'2 : ctx_names BR Ctx
IsBR : is_list (is_pair is_string is_value) Scope
IsBR1 : is_list (is_list (is_pair is_string is_value)) BR
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < NamesBR: apply names_exists to IsBR1.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 N4
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope
CN'2 : ctx_names BR Ctx
IsBR : is_list (is_pair is_string is_value) Scope
IsBR1 : is_list (is_list (is_pair is_string is_value)) BR
NamesBR : names BR N4
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < IsN4: apply names_is to _ NamesBR.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 N4
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope
CN'2 : ctx_names BR Ctx
IsBR : is_list (is_pair is_string is_value) Scope
IsBR1 : is_list (is_list (is_pair is_string is_value)) BR
NamesBR : names BR N4
IsN4 : is_list is_string N4
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < Fr': apply fresh_name_exists to _ _ with
          Base = "L" Names = X::N4.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx Scope O4 O12 Fields V1 V2 N BR SNames BNames Scope'1 N4 F
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::BR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::([(L, V2)]::BR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::BR) O12
NNS' : length BR N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names BR BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope
CN'2 : ctx_names BR Ctx
IsBR : is_list (is_pair is_string is_value) Scope
IsBR1 : is_list (is_list (is_pair is_string is_value)) BR
NamesBR : names BR N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < NS: apply evalStmt_names_same to _ _ _ EvB.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply fresh_name_unique_mems to Fr Fr' _ _.

Subgoal 1.8.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 forall X1, mem X1 (X::N4) -> mem X1 (X::Names)
 < intros M.

Subgoal 1.8.1.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 (X::N4)
============================
 mem X1 (X::Names)
 < M: case M.

Subgoal 1.8.1.2.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 mem X (X::Names)
 < search.

Subgoal 1.8.1.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 N4
============================
 mem X1 (X::Names)
 < NS': apply names_same_symmetric to NS.

Subgoal 1.8.1.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 N4
NS' : names_same EE'' EE
============================
 mem X1 (X::Names)
 < apply names_same_names to NS' NamesBR Names M.

Subgoal 1.8.1.2.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 N4
NS' : names_same EE'' EE
H8 : mem X1 Names
============================
 mem X1 (X::Names)
 < search.

Subgoal 1.8.1.3:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 forall X1, mem X1 (X::Names) -> mem X1 (X::N4)
 < intros M.

Subgoal 1.8.1.3:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 (X::Names)
============================
 mem X1 (X::N4)
 < M: case M.

Subgoal 1.8.1.3.1:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 mem X (X::N4)
 < search.

Subgoal 1.8.1.3.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 Names
============================
 mem X1 (X::N4)
 < apply names_same_names to NS Names NamesBR M.

Subgoal 1.8.1.3.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE'' X1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(L, V2)]::EE'') (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'2::([(L, V2)]::EE'')) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(L, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 Names
H8 : mem X1 N4
============================
 mem X1 (X::N4)
 < search.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(F, V2)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes F ([(F, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes F ([]::([(F, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(F, V2)]::EE)) Body (Scope'2::([(F, V2)]::EE'')) O12 *
Ev9 : replaceScopes F V2 ([(X, V1)]::([(F, recVal Fields)]::EE)) ([(X, V1)]::([(F, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes F ([(X, V1)]::([(F, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(F, V2)]] N ([(F, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string F
IsR1 : is_string F
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(F, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply IH to _ _ _ _ _ _ NamesBR Fr' CN'2 BN Ev2.

Subgoal 1.8.1:

Variables: FE EE X Body Scope' EE' O Names Ctx O4 O12 Fields V1 V2 N SNames BNames Scope'1 N4 F Scope'2 EE''
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] (Scope'1::Ctx)
Ev2 : evalStmt FE ([(F, V2)]::EE'') (while (not (null (name F))) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes F ([(F, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes F ([]::([(F, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(F, V2)]::EE)) Body (Scope'2::([(F, V2)]::EE'')) O12 *
Ev9 : replaceScopes F V2 ([(X, V1)]::([(F, recVal Fields)]::EE)) ([(X, V1)]::([(F, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes F ([(X, V1)]::([(F, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(F, V2)]] N ([(F, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string F
IsR1 : is_string F
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'2::EE'') O12
NNS' : length EE'' N
NNS'3 : names [[(F, V2)]] SNames
NNS'4 : names EE'' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : forall X1, mem X1 [X] -> mem X1 Scope'1
CN' : forall K I, mem (K, I) Scope'2 -> mem K Scope'1
CN'1 : forall K, mem K Scope'1 -> exists I, mem (K, I) Scope'2
CN'2 : ctx_names EE'' Ctx
IsBR : is_list (is_pair is_string is_value) Scope'2
IsBR1 : is_list (is_list (is_pair is_string is_value)) EE''
NamesBR : names EE'' N4
IsN4 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
H8 : iterateList FE EE'' V2 X Body EE' O4
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < search.

Subgoal 1.8.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' Scope O4 O12 Fields V1 V2 N BR1 S AR
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope::(S::AR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope::(S::BR1)) O12
NNS' : newNameScopes [[(L, V2)]] N AR BR1
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < NS: apply evalStmt_names_same to _ _ _ EvB.

Subgoal 1.8.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12
NNS' : newNameScopes [[(L, V2)]] N AR BR1
NS : names_same EE (S::BR1)
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < LenBR+: apply names_same_length to NS Len.

Subgoal 1.8.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12
NNS' : newNameScopes [[(L, V2)]] N AR BR1
NS : names_same EE (S::BR1)
LenBR+ : length (S::BR1) N
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < LenBR: case LenBR+.

Subgoal 1.8.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 N'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12
NNS' : newNameScopes [[(L, V2)]] N AR BR1
NS : names_same EE (S::BR1)
LenBR : length BR1 N'
LenBR1 : 1 + N' = N
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply length_is to LenBR.

Subgoal 1.8.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 N'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12
NNS' : newNameScopes [[(L, V2)]] N AR BR1
NS : names_same EE (S::BR1)
LenBR : length BR1 N'
LenBR1 : 1 + N' = N
H6 : is_integer N'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 1.8.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 N'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12
NNS' : newNameScopes [[(L, V2)]] N AR BR1
NS : names_same EE (S::BR1)
LenBR : length BR1 N'
LenBR1 : 1 + N' = N
H6 : is_integer N'
LEq : N <= N'
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 1.8.2:

Variables: FE EE X Body Scope' EE' O Names L Ctx Ctx' O4 O12 Fields V1 V2 N BR1 S AR Scope'1 N'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev2 : evalStmt FE (S::AR) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O4 *
Ev4 : O12 ++ O4 = O
Ev5 : lookup Fields "null" falseVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE) (recVal Fields)
Ev7 : lookup Fields "head" V1
Ev1 : lookupScopes L ([]::([(L, recVal Fields)]::EE)) (recVal Fields)
Ev6 : evalStmt FE ([(X, V1)]::([(L, V2)]::EE)) Body (Scope'1::(S::AR)) O12 *
Ev9 : replaceScopes L V2 ([(X, V1)]::([(L, recVal Fields)]::EE)) ([(X, V1)]::([(L, V2)]::EE))
Ev10 : lookup Fields "tail" V2
Ev3 : lookupScopes L ([(X, V1)]::([(L, recVal Fields)]::EE)) (recVal Fields)
Len : length EE N
NNS : newNameScopes [[(L, V2)]] N ([(L, V2)]::EE) EE
H1 : ctx_names ([(X, V1)]::EE) ([X]::Ctx)
H2 : is_string L
IsR1 : is_string L
H3 : is_list (is_pair is_string is_value) Fields
H4 : is_value V1
H5 : is_value V2
EvB : evalStmt FE ([(X, V1)]::EE) Body (Scope'1::(S::BR1)) O12
NNS' : newNameScopes [[(L, V2)]] N AR BR1
NS : names_same EE (S::BR1)
LenBR : length BR1 N'
LenBR1 : 1 + N' = N
H6 : is_integer N'
LEq : N <= N'
L : N' < N
============================
 iterateList FE EE (recVal Fields) X Body EE' O
 < apply less_lesseq_flip_false to L LEq.

Subgoal 2:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev : evalExpr FE ([(L, V)]::EE) (not (null (name L))) falseVal (Scope'::EE') O *
============================
 iterateList FE EE V X Body EE' O
 < Ev: case Ev.

Subgoal 2:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx'
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev : evalExpr FE ([(L, V)]::EE) (null (name L)) trueVal (Scope'::EE') O *
============================
 iterateList FE EE V X Body EE' O
 < Ev: case Ev.

Subgoal 2:

Variables: FE EE V X Body Scope' EE' O Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev : evalExpr FE ([(L, V)]::EE) (name L) (recVal Fields) (Scope'::EE') O *
Ev1 : lookup Fields "null" trueVal
============================
 iterateList FE EE V X Body EE' O
 < Ev: case Ev.

Subgoal 2:

Variables: FE V X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
Ev : lookupScopes L ([(L, V)]::EE') (recVal Fields)
============================
 iterateList FE EE' V X Body EE' []
 < Eq: assert V = recVal Fields.

Subgoal 2.1:

Variables: FE V X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
Ev : lookupScopes L ([(L, V)]::EE') (recVal Fields)
============================
 V = recVal Fields
 < LS: case Ev.

Subgoal 2.1.1:

Variables: FE V X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
LS : lookup [(L, V)] L (recVal Fields)
============================
 V = recVal Fields
 < L: case LS.

Subgoal 2.1.1.1:

Variables: FE X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
============================
 recVal Fields = recVal Fields
 < search.

Subgoal 2.1.1.2:

Variables: FE V X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
L : L = L -> false
L1 : lookup [] L (recVal Fields)
============================
 V = recVal Fields
 < apply L to _.

Subgoal 2.1.2:

Variables: FE V X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
LS : no_lookup [(L, V)] L
LS1 : lookupScopes L EE' (recVal Fields)
============================
 V = recVal Fields
 < NL: case LS.

Subgoal 2.1.2:

Variables: FE V X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
LS1 : lookupScopes L EE' (recVal Fields)
NL : L = L -> false
NL1 : no_lookup [] L
============================
 V = recVal Fields
 < apply NL to _.

Subgoal 2:

Variables: FE V X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value V
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
Ev : lookupScopes L ([(L, V)]::EE') (recVal Fields)
Eq : V = recVal Fields
============================
 iterateList FE EE' V X Body EE' []
 < case Eq.

Subgoal 2:

Variables: FE X Body EE' Names L Ctx Ctx' Fields
IH : forall FE EE V X Body Scope' EE' O Names L Ctx Ctx',
       is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
       names EE Names -> fresh_name "L" (X::Names) L -> ctx_names EE Ctx -> stmtNames ([X]::Ctx) Body [] Ctx' ->
       evalStmt FE ([(L, V)]::EE) (while (not (null (name L))) (seq (declare intTy X (head (name L))) (seq (assign L (tail (name L))) Body))) (Scope'::EE') O * ->
       iterateList FE EE V X Body EE' O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
CN : ctx_names EE' Ctx
BN : stmtNames ([X]::Ctx) Body [] Ctx'
Ev1 : lookup Fields "null" trueVal
Ev : lookupScopes L ([(L, recVal Fields)]::EE') (recVal Fields)
============================
 iterateList FE EE' (recVal Fields) X Body EE' []
 < search.

Proof completed.
 < Theorem lookupScopes_replaceScopes_exists :
     forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V ->
       exists R, replaceScopes Key V' L R.

============================
 forall L Key V V',
   is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V ->
   exists R, replaceScopes Key V' L R
 < induction on 3.

IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
============================
 forall L Key V V',
   is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V @ ->
   exists R, replaceScopes Key V' L R
 < intros IsL IsKey LS.

Variables: L Key V V'
IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
IsL : is_list (is_list (is_pair is_string is_value)) L
IsKey : is_string Key
LS : lookupScopes Key L V @
============================
 exists R, replaceScopes Key V' L R
 < LS: case LS.

Subgoal 1:

Variables: Key V V' Rest L1
IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest)
IsKey : is_string Key
LS : lookup L1 Key V
============================
 exists R, replaceScopes Key V' (L1::Rest) R
 < Is: case IsL.

Subgoal 1:

Variables: Key V V' Rest L1
IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
IsKey : is_string Key
LS : lookup L1 Key V
Is : is_list (is_pair is_string is_value) L1
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
============================
 exists R, replaceScopes Key V' (L1::Rest) R
 < RA: apply remove_all_exists to Is IsKey.

Subgoal 1:

Variables: Key V V' Rest L1 EE'
IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
IsKey : is_string Key
LS : lookup L1 Key V
Is : is_list (is_pair is_string is_value) L1
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
RA : remove_all L1 Key EE'
============================
 exists R, replaceScopes Key V' (L1::Rest) R
 < M: apply lookup_mem to LS.

Subgoal 1:

Variables: Key V V' Rest L1 EE'
IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
IsKey : is_string Key
LS : lookup L1 Key V
Is : is_list (is_pair is_string is_value) L1
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
RA : remove_all L1 Key EE'
M : mem (Key, V) L1
============================
 exists R, replaceScopes Key V' (L1::Rest) R
 < search.

Subgoal 2:

Variables: Key V V' Rest L1
IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
IsL : is_list (is_list (is_pair is_string is_value)) (L1::Rest)
IsKey : is_string Key
LS : no_lookup L1 Key
LS1 : lookupScopes Key Rest V *
============================
 exists R, replaceScopes Key V' (L1::Rest) R
 < case IsL.

Subgoal 2:

Variables: Key V V' Rest L1
IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
IsKey : is_string Key
LS : no_lookup L1 Key
LS1 : lookupScopes Key Rest V *
H1 : is_list (is_pair is_string is_value) L1
H2 : is_list (is_list (is_pair is_string is_value)) Rest
============================
 exists R, replaceScopes Key V' (L1::Rest) R
 < apply IH to _ _ LS1 with
     V' = V'.

Subgoal 2:

Variables: Key V V' Rest L1 R
IH : forall L Key V V',
       is_list (is_list (is_pair is_string is_value)) L -> is_string Key -> lookupScopes Key L V * ->
       exists R, replaceScopes Key V' L R
IsKey : is_string Key
LS : no_lookup L1 Key
LS1 : lookupScopes Key Rest V *
H1 : is_list (is_pair is_string is_value) L1
H2 : is_list (is_list (is_pair is_string is_value)) Rest
H3 : replaceScopes Key V' Rest R
============================
 exists R, replaceScopes Key V' (L1::Rest) R
 < search.

Proof completed.
 < Theorem replaceScopes_lookupScopes_same  [Key, Item] :
     forall L (Key : Key) (V : Item) R,
       replaceScopes Key V L R -> lookupScopes Key R V.

============================
 forall L Key V R, replaceScopes Key V L R -> lookupScopes Key R V
 < induction on 1.

IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V
============================
 forall L Key V R, replaceScopes Key V L R @ -> lookupScopes Key R V
 < intros RS.

Variables: L Key V R
IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V
RS : replaceScopes Key V L R @
============================
 lookupScopes Key R V
 < RS: case RS.

Subgoal 1:

Variables: Key V I Rest LRemain L1
IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V
RS : mem (Key, I) L1
RS1 : remove_all L1 Key LRemain
============================
 lookupScopes Key (((Key, V)::LRemain)::Rest) V
 < search.

Subgoal 2:

Variables: Key V New L1 Rest
IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V
RS : no_lookup L1 Key
RS1 : replaceScopes Key V Rest New *
============================
 lookupScopes Key (L1::New) V
 < apply IH to RS1.

Subgoal 2:

Variables: Key V New L1 Rest
IH : forall L Key V R, replaceScopes Key V L R * -> lookupScopes Key R V
RS : no_lookup L1 Key
RS1 : replaceScopes Key V Rest New *
H1 : lookupScopes Key New V
============================
 lookupScopes Key (L1::New) V
 < search.

Proof completed.
 < Theorem remove_all_twice  [K, V] :
     forall (L : list (pair K V)) K RA RB,
       remove_all L K RA -> remove_all RA K RB -> RA = RB.

============================
 forall L K RA RB, remove_all L K RA -> remove_all RA K RB -> RA = RB
 < induction on 1.

IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
============================
 forall L K RA RB, remove_all L K RA @ -> remove_all RA K RB -> RA = RB
 < intros RA RB.

Variables: L K RA RB
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
RA : remove_all L K RA @
RB : remove_all RA K RB
============================
 RA = RB
 < RA: case RA.

Subgoal 1:

Variables: K RB
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
RB : remove_all [] K RB
============================
 [] = RB
 < case RB.

Subgoal 1:

Variables: K
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
============================
 [] = []
 < search.

Subgoal 2:

Variables: K RA RB Rest Item
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
RB : remove_all RA K RB
RA : remove_all Rest K RA *
============================
 RA = RB
 < apply IH to RA RB.

Subgoal 2:

Variables: K RB Rest Item
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
RB : remove_all RB K RB
RA : remove_all Rest K RB *
============================
 RB = RB
 < search.

Subgoal 3:

Variables: K RB R Item K1 Rest
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
RB : remove_all ((K1, Item)::R) K RB
RA : K1 = K -> false
RA1 : remove_all Rest K R *
============================
 (K1, Item)::R = RB
 < RB: case RB.

Subgoal 3.1:

Variables: K RB R Item Rest
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
RA : K = K -> false
RA1 : remove_all Rest K R *
RB : remove_all R K RB
============================
 (K, Item)::R = RB
 < apply RA to _.

Subgoal 3.2:

Variables: K R Item K1 Rest R1
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
RA : K1 = K -> false
RA1 : remove_all Rest K R *
RB : K1 = K -> false
RB1 : remove_all R K R1
============================
 (K1, Item)::R = (K1, Item)::R1
 < apply IH to RA1 RB1.

Subgoal 3.2:

Variables: K Item K1 Rest R1
IH : forall L K RA RB, remove_all L K RA * -> remove_all RA K RB -> RA = RB
RA : K1 = K -> false
RA1 : remove_all Rest K R1 *
RB : K1 = K -> false
RB1 : remove_all R1 K R1
============================
 (K1, Item)::R1 = (K1, Item)::R1
 < search.

Proof completed.
 < Theorem replaceScopes_twice  [Key, Item] :
     forall (L : list (list (pair (string) value))) K VA RA VB RB,
       replaceScopes K VA L RA -> replaceScopes K VB RA RB -> replaceScopes K VB L RB.

============================
 forall L K VA RA VB RB,
   replaceScopes K VA L RA -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
 < induction on 1.

IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
============================
 forall L K VA RA VB RB,
   replaceScopes K VA L RA @ -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
 < intros RSA RSB.

Variables: L K VA RA VB RB
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : replaceScopes K VA L RA @
RSB : replaceScopes K VB RA RB
============================
 replaceScopes K VB L RB
 < RSA: case RSA.

Subgoal 1:

Variables: K VA VB RB I Rest LRemain L1
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSB : replaceScopes K VB (((K, VA)::LRemain)::Rest) RB
RSA : mem (K, I) L1
RSA1 : remove_all L1 K LRemain
============================
 replaceScopes K VB (L1::Rest) RB
 < RSB: case RSB.

Subgoal 1.1:

Variables: K VA VB I Rest LRemain L1 I1 LRemain1
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : mem (K, I) L1
RSA1 : remove_all L1 K LRemain
RSB : mem (K, I1) ((K, VA)::LRemain)
RSB1 : remove_all ((K, VA)::LRemain) K LRemain1
============================
 replaceScopes K VB (L1::Rest) (((K, VB)::LRemain1)::Rest)
 < RA: case RSB1.

Subgoal 1.1.1:

Variables: K VA VB I Rest LRemain L1 I1 LRemain1
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : mem (K, I) L1
RSA1 : remove_all L1 K LRemain
RSB : mem (K, I1) ((K, VA)::LRemain)
RA : remove_all LRemain K LRemain1
============================
 replaceScopes K VB (L1::Rest) (((K, VB)::LRemain1)::Rest)
 < apply remove_all_twice to RSA1 RA.

Subgoal 1.1.1:

Variables: K VA VB I Rest L1 I1 LRemain1
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : mem (K, I) L1
RSA1 : remove_all L1 K LRemain1
RSB : mem (K, I1) ((K, VA)::LRemain1)
RA : remove_all LRemain1 K LRemain1
============================
 replaceScopes K VB (L1::Rest) (((K, VB)::LRemain1)::Rest)
 < search.

Subgoal 1.1.2:

Variables: K VA VB I Rest LRemain L1 I1 R
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : mem (K, I) L1
RSA1 : remove_all L1 K LRemain
RSB : mem (K, I1) ((K, VA)::LRemain)
RA : K = K -> false
RA1 : remove_all LRemain K R
============================
 replaceScopes K VB (L1::Rest) (((K, VB)::((K, VA)::R))::Rest)
 < apply RA to _.

Subgoal 1.2:

Variables: K VA VB I Rest LRemain L1 New
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : mem (K, I) L1
RSA1 : remove_all L1 K LRemain
RSB : no_lookup ((K, VA)::LRemain) K
RSB1 : replaceScopes K VB Rest New
============================
 replaceScopes K VB (L1::Rest) (((K, VA)::LRemain)::New)
 < N: case RSB.

Subgoal 1.2:

Variables: K VA VB I Rest LRemain L1 New
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : mem (K, I) L1
RSA1 : remove_all L1 K LRemain
RSB1 : replaceScopes K VB Rest New
N : K = K -> false
N1 : no_lookup LRemain K
============================
 replaceScopes K VB (L1::Rest) (((K, VA)::LRemain)::New)
 < apply N to _.

Subgoal 2:

Variables: K VA VB RB New L1 Rest
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSB : replaceScopes K VB (L1::New) RB
RSA : no_lookup L1 K
RSA1 : replaceScopes K VA Rest New *
============================
 replaceScopes K VB (L1::Rest) RB
 < RSB: case RSB.

Subgoal 2.1:

Variables: K VA VB New L1 Rest I LRemain
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : no_lookup L1 K
RSA1 : replaceScopes K VA Rest New *
RSB : mem (K, I) L1
RSB1 : remove_all L1 K LRemain
============================
 replaceScopes K VB (L1::Rest) (((K, VB)::LRemain)::New)
 < apply no_lookup_mem to RSA RSB.

Subgoal 2.2:

Variables: K VA VB New L1 Rest New1
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : no_lookup L1 K
RSA1 : replaceScopes K VA Rest New *
RSB : no_lookup L1 K
RSB1 : replaceScopes K VB New New1
============================
 replaceScopes K VB (L1::Rest) (L1::New1)
 < apply IH to RSA1 RSB1.

Subgoal 2.2:

Variables: K VA VB New L1 Rest New1
IH : forall L K VA RA VB RB,
       replaceScopes K VA L RA * -> replaceScopes K VB RA RB -> replaceScopes K VB L RB
RSA : no_lookup L1 K
RSA1 : replaceScopes K VA Rest New *
RSB : no_lookup L1 K
RSB1 : replaceScopes K VB New New1
H1 : replaceScopes K VB Rest New1
============================
 replaceScopes K VB (L1::Rest) (L1::New1)
 < search.

Proof completed.
 < Theorem updateListIndex_is_integer :
     forall L I V L', updateListIndex L I V L' -> is_integer I.

============================
 forall L I V L', updateListIndex L I V L' -> is_integer I
 < induction on 1.

IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
============================
 forall L I V L', updateListIndex L I V L' @ -> is_integer I
 < intros ULI.

Variables: L I V L'
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
ULI : updateListIndex L I V L' @
============================
 is_integer I
 < ULI: case ULI.

Subgoal 1:

Variables: V NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
============================
 is_integer 0
 < search.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
============================
 is_integer I
 < IsI1: apply IH to ULI3.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
IsI1 : is_integer I1
============================
 is_integer I
 < apply minus_integer_is_integer_result to _ ULI1.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
IsI1 : is_integer I1
H1 : is_integer I
H2 : is_integer 1
============================
 is_integer I
 < search.

Proof completed.
 < Theorem updateListIndex_pos :
     forall L I V L', updateListIndex L I V L' -> I >= 0.

============================
 forall L I V L', updateListIndex L I V L' -> I >= 0
 < induction on 1.

IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
============================
 forall L I V L', updateListIndex L I V L' @ -> I >= 0
 < intros ULI.

Variables: L I V L'
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
ULI : updateListIndex L I V L' @
============================
 I >= 0
 < IsI: apply updateListIndex_is_integer to ULI.

Variables: L I V L'
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
ULI : updateListIndex L I V L' @
IsI : is_integer I
============================
 I >= 0
 < ULI: case ULI.

Subgoal 1:

Variables: V NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer 0
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
============================
 0 >= 0
 < search.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
============================
 I >= 0
 < GEq: apply IH to ULI3.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEq : I1 >= 0
============================
 I >= 0
 < P: apply minus_plus_same_integer to _ _ ULI1.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEq : I1 >= 0
P : I1 + 1 = I
============================
 I >= 0
 < IsI1: apply updateListIndex_is_integer to ULI3.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEq : I1 >= 0
P : I1 + 1 = I
IsI1 : is_integer I1
============================
 I >= 0
 < P': apply plus_integer_comm to _ _ P.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEq : I1 >= 0
P : I1 + 1 = I
IsI1 : is_integer I1
P' : 1 + I1 = I
============================
 I >= 0
 < L: apply lt_plus_one to P' _.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEq : I1 >= 0
P : I1 + 1 = I
IsI1 : is_integer I1
P' : 1 + I1 = I
L : I1 < I
============================
 I >= 0
 < LEq: case GEq.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
P : I1 + 1 = I
IsI1 : is_integer I1
P' : 1 + I1 = I
L : I1 < I
LEq : 0 <= I1
============================
 I >= 0
 < L': apply lesseq_less_integer_transitive to LEq L.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
P : I1 + 1 = I
IsI1 : is_integer I1
P' : 1 + I1 = I
L : I1 < I
LEq : 0 <= I1
L' : 0 < I
============================
 I >= 0
 < G: assert I > 0.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
P : I1 + 1 = I
IsI1 : is_integer I1
P' : 1 + I1 = I
L : I1 < I
LEq : 0 <= I1
L' : 0 < I
G : I > 0
============================
 I >= 0
 < apply greater_integer_greatereq to G.

Subgoal 2:

Variables: I V I1 Tl TlNew NewFields Fields
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
P : I1 + 1 = I
IsI1 : is_integer I1
P' : 1 + I1 = I
L : I1 < I
LEq : 0 <= I1
L' : 0 < I
G : I > 0
H1 : I >= 0
============================
 I >= 0
 < search.

Proof completed.
 < Define listy : value -> prop by
   listy (recVal Fields) :=
     lookup Fields "null" trueVal;
   listy (recVal Fields) :=
     exists Tl,
       (lookup Fields "null" falseVal /\ lookup Fields "tail" Tl) /\ listy Tl.


 < Define flipOnto : value -> value -> value -> prop by
   flipOnto (recVal Fields) L L :=
     lookup Fields "null" trueVal;
   flipOnto (recVal Fields) L L' :=
     exists Fields' T,
       ((lookup Fields "null" falseVal /\ lookup Fields "tail" T) /\
       replaceRecVal "tail" L Fields Fields') /\
       flipOnto T (recVal Fields') L'.


 < Theorem lookup_replaceRecVal_exists :
     forall L F V V', lookup L F V -> exists R, replaceRecVal F V' L R.

============================
 forall L F V V', lookup L F V -> exists R, replaceRecVal F V' L R
 < induction on 1.

IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
============================
 forall L F V V', lookup L F V @ -> exists R, replaceRecVal F V' L R
 < intros L.

Variables: L F V V'
IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
L : lookup L F V @
============================
 exists R, replaceRecVal F V' L R
 < L: case L.

Subgoal 1:

Variables: F V V' Rest
IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
============================
 exists R, replaceRecVal F V' ((F, V)::Rest) R
 < search.

Subgoal 2:

Variables: F V V' Rest V1 K
IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
L : K = F -> false
L1 : lookup Rest F V *
============================
 exists R, replaceRecVal F V' ((K, V1)::Rest) R
 < assert F = K -> false.

Subgoal 2.1:

Variables: F V V' Rest V1 K
IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
L : K = F -> false
L1 : lookup Rest F V *
============================
 F = K -> false
 < intros E.

Subgoal 2.1:

Variables: F V V' Rest V1 K
IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
L : K = F -> false
L1 : lookup Rest F V *
E : F = K
============================
 false
 < case E.

Subgoal 2.1:

Variables: V V' Rest V1 K
IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
L : K = K -> false
L1 : lookup Rest K V *
============================
 false
 < backchain L.

Subgoal 2:

Variables: F V V' Rest V1 K
IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
L : K = F -> false
L1 : lookup Rest F V *
H1 : F = K -> false
============================
 exists R, replaceRecVal F V' ((K, V1)::Rest) R
 < apply IH to L1 with
     V' = V'.

Subgoal 2:

Variables: F V V' Rest V1 K R
IH : forall L F V V', lookup L F V * -> exists R, replaceRecVal F V' L R
L : K = F -> false
L1 : lookup Rest F V *
H1 : F = K -> false
H2 : replaceRecVal F V' Rest R
============================
 exists R, replaceRecVal F V' ((K, V1)::Rest) R
 < search.

Proof completed.
 < Theorem replaceScopes_lookupScopes  [Key, Item] :
     forall (X : Key) (V : Item) L R,
       replaceScopes X V L R -> lookupScopes X R V.

============================
 forall X V L R, replaceScopes X V L R -> lookupScopes X R V
 < induction on 1.

IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V
============================
 forall X V L R, replaceScopes X V L R @ -> lookupScopes X R V
 < intros RS.

Variables: X V L R
IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V
RS : replaceScopes X V L R @
============================
 lookupScopes X R V
 < RS: case RS.

Subgoal 1:

Variables: X V I Rest LRemain L1
IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V
RS : mem (X, I) L1
RS1 : remove_all L1 X LRemain
============================
 lookupScopes X (((X, V)::LRemain)::Rest) V
 < search.

Subgoal 2:

Variables: X V New L1 Rest
IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V
RS : no_lookup L1 X
RS1 : replaceScopes X V Rest New *
============================
 lookupScopes X (L1::New) V
 < apply IH to RS1.

Subgoal 2:

Variables: X V New L1 Rest
IH : forall X V L R, replaceScopes X V L R * -> lookupScopes X R V
RS : no_lookup L1 X
RS1 : replaceScopes X V Rest New *
H1 : lookupScopes X New V
============================
 lookupScopes X (L1::New) V
 < search.

Proof completed.
 < Theorem replaceRecVal_lookup :
     forall L F V R, replaceRecVal F V L R -> lookup R F V.

============================
 forall L F V R, replaceRecVal F V L R -> lookup R F V
 < induction on 1.

IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
============================
 forall L F V R, replaceRecVal F V L R @ -> lookup R F V
 < intros R.

Variables: L F V R
IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
R : replaceRecVal F V L R @
============================
 lookup R F V
 < R: case R.

Subgoal 1:

Variables: F V Rest VOld
IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
============================
 lookup ((F, V)::Rest) F V
 < search.

Subgoal 2:

Variables: F V RRest VO O Rest
IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
R : F = O -> false
R1 : replaceRecVal F V Rest RRest *
============================
 lookup ((O, VO)::RRest) F V
 < assert O = F -> false.

Subgoal 2.1:

Variables: F V RRest VO O Rest
IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
R : F = O -> false
R1 : replaceRecVal F V Rest RRest *
============================
 O = F -> false
 < intros E.

Subgoal 2.1:

Variables: F V RRest VO O Rest
IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
R : F = O -> false
R1 : replaceRecVal F V Rest RRest *
E : O = F
============================
 false
 < case E.

Subgoal 2.1:

Variables: F V RRest VO Rest
IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
R : F = F -> false
R1 : replaceRecVal F V Rest RRest *
============================
 false
 < backchain R.

Subgoal 2:

Variables: F V RRest VO O Rest
IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
R : F = O -> false
R1 : replaceRecVal F V Rest RRest *
H1 : O = F -> false
============================
 lookup ((O, VO)::RRest) F V
 < apply IH to R1.

Subgoal 2:

Variables: F V RRest VO O Rest
IH : forall L F V R, replaceRecVal F V L R * -> lookup R F V
R : F = O -> false
R1 : replaceRecVal F V Rest RRest *
H1 : O = F -> false
H2 : lookup RRest F V
============================
 lookup ((O, VO)::RRest) F V
 < search.

Proof completed.
 < Theorem replaceRecVal_lookup_other :
     forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' -> (F = F' -> false) -> lookup R F' V'.

============================
 forall L F V R F' V',
   replaceRecVal F V L R -> lookup L F' V' -> (F = F' -> false) -> lookup R F' V'
 < induction on 2.

IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
============================
 forall L F V R F' V',
   replaceRecVal F V L R -> lookup L F' V' @ -> (F = F' -> false) -> lookup R F' V'
 < intros RRV L NEq.

Variables: L F V R F' V'
IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
RRV : replaceRecVal F V L R
L : lookup L F' V' @
NEq : F = F' -> false
============================
 lookup R F' V'
 < L: case L.

Subgoal 1:

Variables: F V R F' V' Rest
IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
RRV : replaceRecVal F V ((F', V')::Rest) R
NEq : F = F' -> false
============================
 lookup R F' V'
 < RRV: case RRV.

Subgoal 1.1:

Variables: V F' V' Rest
IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
NEq : F' = F' -> false
============================
 lookup ((F', V)::Rest) F' V'
 < apply NEq to _.

Subgoal 1.2:

Variables: F V F' V' Rest RRest
IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
NEq : F = F' -> false
RRV : F = F' -> false
RRV1 : replaceRecVal F V Rest RRest
============================
 lookup ((F', V')::RRest) F' V'
 < search.

Subgoal 2:

Variables: F V R F' V' Rest V1 K
IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
RRV : replaceRecVal F V ((K, V1)::Rest) R
NEq : F = F' -> false
L : K = F' -> false
L1 : lookup Rest F' V' *
============================
 lookup R F' V'
 < RRV: case RRV.

Subgoal 2.1:

Variables: V F' V' Rest V1 K
IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
NEq : K = F' -> false
L : K = F' -> false
L1 : lookup Rest F' V' *
============================
 lookup ((K, V)::Rest) F' V'
 < search.

Subgoal 2.2:

Variables: F V F' V' Rest V1 K RRest
IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
NEq : F = F' -> false
L : K = F' -> false
L1 : lookup Rest F' V' *
RRV : F = K -> false
RRV1 : replaceRecVal F V Rest RRest
============================
 lookup ((K, V1)::RRest) F' V'
 < apply IH to RRV1 L1 _.

Subgoal 2.2:

Variables: F V F' V' Rest V1 K RRest
IH : forall L F V R F' V',
       replaceRecVal F V L R -> lookup L F' V' * -> (F = F' -> false) -> lookup R F' V'
NEq : F = F' -> false
L : K = F' -> false
L1 : lookup Rest F' V' *
RRV : F = K -> false
RRV1 : replaceRecVal F V Rest RRest
H1 : lookup RRest F' V'
============================
 lookup ((K, V1)::RRest) F' V'
 < search.

Proof completed.
 < Theorem replaceRecVal_twice :
     forall A B C F V1 V2,
       replaceRecVal F V1 A B -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C.

============================
 forall A B C F V1 V2,
   replaceRecVal F V1 A B -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
 < induction on 1.

IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
============================
 forall A B C F V1 V2,
   replaceRecVal F V1 A B @ -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
 < intros RAB RBC.

Variables: A B C F V1 V2
IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
RAB : replaceRecVal F V1 A B @
RBC : replaceRecVal F V2 B C
============================
 replaceRecVal F V2 A C
 < RAB: case RAB.

Subgoal 1:

Variables: C F V1 V2 Rest VOld
IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
RBC : replaceRecVal F V2 ((F, V1)::Rest) C
============================
 replaceRecVal F V2 ((F, VOld)::Rest) C
 < RBC: case RBC.

Subgoal 1.1:

Variables: F V1 V2 Rest VOld
IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
============================
 replaceRecVal F V2 ((F, VOld)::Rest) ((F, V2)::Rest)
 < search.

Subgoal 1.2:

Variables: F V1 V2 Rest VOld RRest
IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
RBC : F = F -> false
RBC1 : replaceRecVal F V2 Rest RRest
============================
 replaceRecVal F V2 ((F, VOld)::Rest) ((F, V1)::RRest)
 < apply RBC to _.

Subgoal 2:

Variables: C F V1 V2 RRest VO O Rest
IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
RBC : replaceRecVal F V2 ((O, VO)::RRest) C
RAB : F = O -> false
RAB1 : replaceRecVal F V1 Rest RRest *
============================
 replaceRecVal F V2 ((O, VO)::Rest) C
 < RBC: case RBC.

Subgoal 2.1:

Variables: V1 V2 RRest VO O Rest
IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
RAB : O = O -> false
RAB1 : replaceRecVal O V1 Rest RRest *
============================
 replaceRecVal O V2 ((O, VO)::Rest) ((O, V2)::RRest)
 < apply RAB to _.

Subgoal 2.2:

Variables: F V1 V2 RRest VO O Rest RRest1
IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
RAB : F = O -> false
RAB1 : replaceRecVal F V1 Rest RRest *
RBC : F = O -> false
RBC1 : replaceRecVal F V2 RRest RRest1
============================
 replaceRecVal F V2 ((O, VO)::Rest) ((O, VO)::RRest1)
 < apply IH to RAB1 RBC1.

Subgoal 2.2:

Variables: F V1 V2 RRest VO O Rest RRest1
IH : forall A B C F V1 V2,
       replaceRecVal F V1 A B * -> replaceRecVal F V2 B C -> replaceRecVal F V2 A C
RAB : F = O -> false
RAB1 : replaceRecVal F V1 Rest RRest *
RBC : F = O -> false
RBC1 : replaceRecVal F V2 RRest RRest1
H1 : replaceRecVal F V2 Rest RRest1
============================
 replaceRecVal F V2 ((O, VO)::Rest) ((O, VO)::RRest1)
 < search.

Proof completed.
 < Theorem eval_update_loop2 :
     forall (Hold : string) (SaveI : string) (SaveE : string) (Copy : string) (L : string) V HFs HoldL LVal G FE,
       listy HoldL -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV.

============================
 forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
   listy HoldL -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
   lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) ->
   (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
   false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
   (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
   exists G' LV HFs',
     ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     lookup HFs' "null" trueVal) /\
     replaceScopes L LV G G') /\
     flipOnto (recVal HFs) LVal LV
 < induction on 1.

IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
============================
 forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
   listy HoldL @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
   lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI -> false) ->
   (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
   false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
   (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
   exists G' LV HFs',
     ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     lookup HFs' "null" trueVal) /\
     replaceScopes L LV G G') /\
     flipOnto (recVal HFs) LVal LV
 < intros ListyH IsFE IsCtx LkpTl LkpNl NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC LS.

Variables: Hold SaveI SaveE Copy L V HFs HoldL LVal G FE
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
ListyH : listy HoldL @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" HoldL
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < NamesCtx: apply names_exists to IsCtx.

Variables: Hold SaveI SaveE Copy L V HFs HoldL LVal G FE N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
ListyH : listy HoldL @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" HoldL
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) N
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < rename N to Names.

Variables: Hold SaveI SaveE Copy L V HFs HoldL LVal G FE Names
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
ListyH : listy HoldL @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" HoldL
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < ListyH: case ListyH.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvCondA: assert <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [].

Subgoal 1.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
============================
 <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
 < unfold .

Subgoal 1.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
============================
 <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (null (name Hold)) falseVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
 < unfold .

Subgoal 1.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
============================
 exists Names E_P V_P EE_P O_P Fields,
   (<evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (name Hold) (recVal Fields) ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] /\
   lookup Fields "null" falseVal) /\
   (names ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) Names /\
   (Names |{expr}- null (name Hold) ~~> E_P /\
   <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) E_P V_P EE_P O_P))
 < exists Names,
   recFieldAccess (name Hold) "null",
   falseVal,
   []::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G),
   [],
   HFs.

Subgoal 1.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
============================
 (<evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (name Hold) (recVal HFs) ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] /\
 lookup HFs "null" falseVal) /\
 (names ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) Names /\
 (Names |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null" /\
 <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recFieldAccess (name Hold) "null") falseVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []))
 < search.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvBody1: assert <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [].

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < RRVCopy: apply lookup_replaceRecVal_exists to LkpTl with
              V' = LVal.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvBody2: assert <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [].

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < apply lookupScopes_is to _ LS.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < RS: apply lookupScopes_replaceScopes_exists to _ _ LS with
         V' = recVal R.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvBody3: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) [].

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Eq: assert exists R',
     R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'.

Subgoal 1.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) []
============================
 exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < RS: case RS.

Subgoal 1.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R I LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) []
RS : mem (L, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain
============================
 exists R',
   ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < M: case RS.

Subgoal 1.2.1.1:

Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Fields R LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string Hold
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::(((Hold, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold LRemain
============================
 exists R',
   ((Hold, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < apply NEqHL to _.

Subgoal 1.2.1.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R I LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists R',
   ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < M: case M.

Subgoal 1.2.1.2.1:

Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Fields R LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveI -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveI -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveI -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes SaveI ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name SaveI)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string SaveI
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveI (name Copy)) ([(Copy, recVal R)]::(((SaveI, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain
============================
 exists R',
   ((SaveI, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < apply NEqIL to _.

Subgoal 1.2.1.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R I LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveE, V)]
============================
 exists R',
   ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < M: case M.

Subgoal 1.2.1.2.2.1:

Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Fields R LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveE -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveE -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveE -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveE -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes SaveE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name SaveE)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string SaveE
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveE (name Copy)) ([(Copy, recVal R)]::(((SaveE, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain
============================
 exists R',
   ((SaveE, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < apply NEqEL to _.

Subgoal 1.2.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R I LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) []
============================
 exists R',
   ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < case M.

Subgoal 1.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R New
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::New)) []
RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L
RS1 : replaceScopes L (recVal R) G New
============================
 exists R',
   [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::New = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < search.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) []
Eq : exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Is: case IsCtx.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Is: case Is.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal HFs)
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Is: case Is.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
Is3 : is_value (recVal HFs)
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < case Is3.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < apply replaceRecVal_is to _ _ RRVCopy.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Is+: apply replaceScopes_is to _ _ RS.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < apply names_exists to Is+.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvBody4: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [].

Subgoal 1.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
 < unfold .

Subgoal 1.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 exists V1 EE1,
   <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) V1 EE1 [] /\
   replaceScopes Hold V1 EE1 ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
 < exists recVal Fields,
   [(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R').

Subgoal 1.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\
 replaceScopes Hold (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
 < split.

Subgoal 1.3.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
 < unfold .

Subgoal 1.3.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 exists Names E_P V_P EE_P O_P Fields1,
   (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal Fields1) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\
   lookup Fields1 "tail" (recVal Fields)) /\
   (names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) Names /\
   (Names |{expr}- tail (name Hold) ~~> E_P /\
   <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) E_P V_P EE_P O_P))
 < exists Copy::N,
   recFieldAccess (name Hold) "tail",
   recVal Fields,
   [(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'),
   [],
   HFs.

Subgoal 1.3.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal HFs) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\
 lookup HFs "tail" (recVal Fields)) /\
 (names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (Copy::N) /\
 ((Copy::N) |{expr}- tail (name Hold) ~~> recFieldAccess (name Hold) "tail" /\
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recFieldAccess (name Hold) "tail") (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []))
 < split.

Subgoal 1.3.1.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal HFs) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
 < search.

Subgoal 1.3.1.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 lookup HFs "tail" (recVal Fields)
 < search.

Subgoal 1.3.1.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (Copy::N)
 < search.

Subgoal 1.3.1.4:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 (Copy::N) |{expr}- tail (name Hold) ~~> recFieldAccess (name Hold) "tail"
 < search.

Subgoal 1.3.1.5:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recFieldAccess (name Hold) "tail") (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
 < search.

Subgoal 1.3.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 replaceScopes Hold (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
 < unfold .

Subgoal 1.3.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 no_lookup [(Copy, recVal R)] Hold
 < search.

Subgoal 1.3.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 replaceScopes Hold (recVal Fields) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')
 < unfold .

Subgoal 1.3.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 exists I,
   mem (Hold, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] /\
   remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < exists recVal HFs.

Subgoal 1.3.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 mem (Hold, recVal HFs) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] /\
 remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < split.

Subgoal 1.3.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 mem (Hold, recVal HFs) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
 < search.

Subgoal 1.3.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < unfold .

Subgoal 1.3.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 remove_all [(SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < unfold .

Subgoal 1.3.2.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 1.3.2.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 1.3.2.2.2.1:

Variables: Hold SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = Hold -> false
NEqHL : Hold = L -> false
NEqIE : Hold = SaveE -> false
NEqIL : Hold = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : Hold = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(Hold, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R') N
============================
 false
 < backchain NEqHI.

Subgoal 1.3.2.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 remove_all [(SaveE, V)] Hold [(SaveE, V)]
 < unfold .

Subgoal 1.3.2.2.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 SaveE = Hold -> false
 < intros E.

Subgoal 1.3.2.2.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
E : SaveE = Hold
============================
 false
 < case E.

Subgoal 1.3.2.2.2.2.1:

Variables: Hold SaveI Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = Hold -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = Hold -> false
NEqEL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : Hold = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (Hold, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R') N
============================
 false
 < backchain NEqHE.

Subgoal 1.3.2.2.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 remove_all [] Hold []
 < search.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < IsV: apply lookup_is_value to _ LkpTl.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
IsV : is_value (recVal Fields)
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < case IsV.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < case Is+.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < apply names_exists to _ with
     L = [(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvCond2: assert <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [].

Subgoal 1.4:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
 < unfold .

Subgoal 1.4:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (null (name Hold)) trueVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
 < unfold .

Subgoal 1.4:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 exists Names E_P V_P EE_P O_P Fields1,
   (<evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (name Hold) (recVal Fields1) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] /\
   lookup Fields1 "null" trueVal) /\
   (names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') Names /\
   (Names |{expr}- null (name Hold) ~~> E_P /\
   <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') E_P V_P EE_P O_P))
 < exists N1,
   recFieldAccess (name Hold) "null",
   trueVal,
   [(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R',
   [],
   Fields.

Subgoal 1.4:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 (<evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (name Hold) (recVal Fields) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] /\
 lookup Fields "null" trueVal) /\
 (names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1 /\
 (N1 |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null" /\
 <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recFieldAccess (name Hold) "null") trueVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []))
 < split.

Subgoal 1.4.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (name Hold) (recVal Fields) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
 < search.

Subgoal 1.4.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 lookup Fields "null" trueVal
 < search.

Subgoal 1.4.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
 < search.

Subgoal 1.4.4:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 N1 |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null"
 < search.

Subgoal 1.4.5:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
============================
 <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recFieldAccess (name Hold) "null") trueVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
 < search.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < exists R',
   recVal R,
   Fields.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
============================
 ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') [] /\
 lookup Fields "null" trueVal) /\
 replaceScopes L (recVal R) G R') /\
 flipOnto (recVal HFs) LVal (recVal R)
 < split.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
============================
 <evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
 < search 7.

Subgoal 1.6:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
============================
 lookup Fields "null" trueVal
 < search.

Subgoal 1.7:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
============================
 replaceScopes L (recVal R) G R'
 < RS: case RS.

Subgoal 1.7.1:

Variables: Hold SaveI SaveE Copy V HFs LVal FE Names Fields R' N N1 I
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
RRVCopy : replaceRecVal "tail" LVal HFs HFs
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
H1 : is_value LVal
H2 : is_string Hold
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (name Copy)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) R'
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) HFs
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal HFs)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
RS : mem (Hold, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
============================
 replaceScopes Hold (recVal HFs) R' R'
 < apply NEqHL to _.

Subgoal 1.7.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L
RS1 : replaceScopes L (recVal R) G R'
============================
 replaceScopes L (recVal R) G R'
 < search.

Subgoal 1.8:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Fields R R' N N1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" trueVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
H9 : names ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') N1
EvCond2 : <evalExpr {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (not (null (name Hold))) falseVal ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') []
============================
 flipOnto (recVal HFs) LVal (recVal R)
 < search.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvCondA: assert <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [].

Subgoal 2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
============================
 <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
============================
 <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (null (name Hold)) falseVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
============================
 exists Names E_P V_P EE_P O_P Fields,
   (<evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (name Hold) (recVal Fields) ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] /\
   lookup Fields "null" falseVal) /\
   (names ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) Names /\
   (Names |{expr}- null (name Hold) ~~> E_P /\
   <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) E_P V_P EE_P O_P))
 < exists Names,
   recFieldAccess (name Hold) "null",
   falseVal,
   []::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G),
   [],
   HFs.

Subgoal 2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
============================
 (<evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (name Hold) (recVal HFs) ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [] /\
 lookup HFs "null" falseVal) /\
 (names ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) Names /\
 (Names |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null" /\
 <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recFieldAccess (name Hold) "null") falseVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []))
 < search.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvBody1: assert <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [].

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < RRVCopy: apply lookup_replaceRecVal_exists to LkpTl with
              V' = LVal.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvBody2: assert <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) [].

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < apply lookupScopes_is to _ LS.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < RS: apply lookupScopes_replaceScopes_exists to _ _ LS with
         V' = recVal R.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvBody3: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) [].

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Eq: assert exists R',
     R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'.

Subgoal 2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) []
============================
 exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < RS: case RS.

Subgoal 2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R I LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) []
RS : mem (L, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain
============================
 exists R',
   ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < M: case RS.

Subgoal 2.2.1.1:

Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Tl Fields R LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string Hold
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::(((Hold, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold LRemain
============================
 exists R',
   ((Hold, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < apply NEqHL to _.

Subgoal 2.2.1.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R I LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists R',
   ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < M: case M.

Subgoal 2.2.1.2.1:

Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Tl Fields R LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveI -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveI -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveI -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes SaveI ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name SaveI)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string SaveI
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveI (name Copy)) ([(Copy, recVal R)]::(((SaveI, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain
============================
 exists R',
   ((SaveI, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < apply NEqIL to _.

Subgoal 2.2.1.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R I LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveE, V)]
============================
 exists R',
   ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < M: case M.

Subgoal 2.2.1.2.2.1:

Variables: Hold SaveI SaveE Copy V HFs LVal G FE Names Tl Fields R LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveE -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveE -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveE -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveE -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes SaveE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name SaveE)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string SaveE
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveE (name Copy)) ([(Copy, recVal R)]::(((SaveE, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain
============================
 exists R',
   ((SaveE, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < apply NEqEL to _.

Subgoal 2.2.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R I LRemain
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::(((L, recVal R)::LRemain)::G)) []
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) []
============================
 exists R',
   ((L, recVal R)::LRemain)::G = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < case M.

Subgoal 2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R New
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::New)) []
RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L
RS1 : replaceScopes L (recVal R) G New
============================
 exists R',
   [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::New = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
 < search.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R1
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) R1
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::R1) []
Eq : exists R', R1 = [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < case Eq.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCtx : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Is: case IsCtx.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Is: case Is.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal HFs)
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Is: case Is.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
Is3 : is_value (recVal HFs)
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < case Is3.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < apply replaceRecVal_is to _ _ RRVCopy.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Is+: apply replaceScopes_is to _ _ RS.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < apply names_exists to Is+.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < EvBody4: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) [].

Subgoal 2.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
 < unfold .

Subgoal 2.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 exists V1 EE1,
   <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) V1 EE1 [] /\
   replaceScopes Hold V1 EE1 ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
 < exists recVal Fields,
   [(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R').

Subgoal 2.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\
 replaceScopes Hold (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
 < split.

Subgoal 2.3.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (tail (name Hold)) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
 < unfold .

Subgoal 2.3.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 exists Names E_P V_P EE_P O_P Fields1,
   (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal Fields1) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\
   lookup Fields1 "tail" (recVal Fields)) /\
   (names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) Names /\
   (Names |{expr}- tail (name Hold) ~~> E_P /\
   <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) E_P V_P EE_P O_P))
 < exists Copy::N,
   recFieldAccess (name Hold) "tail",
   recVal Fields,
   [(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R'),
   [],
   HFs.

Subgoal 2.3.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal HFs) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) [] /\
 lookup HFs "tail" (recVal Fields)) /\
 (names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (Copy::N) /\
 ((Copy::N) |{expr}- tail (name Hold) ~~> recFieldAccess (name Hold) "tail" /\
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recFieldAccess (name Hold) "tail") (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []))
 < split.

Subgoal 2.3.1.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (name Hold) (recVal HFs) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
 < search.

Subgoal 2.3.1.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 lookup HFs "tail" (recVal Fields)
 < search.

Subgoal 2.3.1.3:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 names ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (Copy::N)
 < search.

Subgoal 2.3.1.4:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 (Copy::N) |{expr}- tail (name Hold) ~~> recFieldAccess (name Hold) "tail"
 < search.

Subgoal 2.3.1.5:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recFieldAccess (name Hold) "tail") (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
 < search.

Subgoal 2.3.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 replaceScopes Hold (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R'))
 < unfold .

Subgoal 2.3.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 no_lookup [(Copy, recVal R)] Hold
 < search.

Subgoal 2.3.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 replaceScopes Hold (recVal Fields) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')
 < unfold .

Subgoal 2.3.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 exists I,
   mem (Hold, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] /\
   remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < exists recVal HFs.

Subgoal 2.3.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 mem (Hold, recVal HFs) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] /\
 remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < split.

Subgoal 2.3.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 mem (Hold, recVal HFs) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
 < search.

Subgoal 2.3.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < unfold .

Subgoal 2.3.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 remove_all [(SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < unfold .

Subgoal 2.3.2.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 2.3.2.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 2.3.2.2.2.1:

Variables: Hold SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = Hold -> false
NEqHL : Hold = L -> false
NEqIE : Hold = SaveE -> false
NEqIL : Hold = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : Hold = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(Hold, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (Hold, intVal 0), (SaveE, V)]::R') N
============================
 false
 < backchain NEqHI.

Subgoal 2.3.2.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 remove_all [(SaveE, V)] Hold [(SaveE, V)]
 < unfold .

Subgoal 2.3.2.2.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 SaveE = Hold -> false
 < intros E.

Subgoal 2.3.2.2.2.2.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
E : SaveE = Hold
============================
 false
 < case E.

Subgoal 2.3.2.2.2.2.1:

Variables: Hold SaveI Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = Hold -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = Hold -> false
NEqEL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : Hold = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (Hold, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (Hold, V)]::R') N
============================
 false
 < backchain NEqHE.

Subgoal 2.3.2.2.2.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
============================
 remove_all [] Hold []
 < search.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < IsV: apply lookup_is_value to _ LkpTl.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
IsV : is_value (recVal Fields)
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < case IsV.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < case Is+.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < LS': apply replaceScopes_lookupScopes to RS.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < LS'': assert lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R).

Subgoal 2.4:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
============================
 lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
 < LS': case LS'.

Subgoal 2.4.1:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L (recVal R)
============================
 lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
 < L: case LS'.

Subgoal 2.4.1.1:

Variables: SaveI SaveE Copy L V LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup R "tail" (recVal Fields)
LkpNl : lookup R "null" falseVal
NEqHI : L = SaveI -> false
NEqHL : L = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : L = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = L -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name L))) trueVal ([]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal R R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G) ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string L
H3 : is_list (is_pair is_string is_value) R
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal 0), (SaveE, V)]::R')) (assign L (tail (name L))) ([(Copy, recVal R)]::([(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(L, recVal R), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
============================
 lookupScopes L ([(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
 < apply NEqHL to _.

Subgoal 2.4.1.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
L : Hold = L -> false
L1 : lookup [(SaveI, intVal 0), (SaveE, V)] L (recVal R)
============================
 lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
 < L': case L1.

Subgoal 2.4.1.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
L : Hold = L -> false
L' : SaveI = L -> false
L'1 : lookup [(SaveE, V)] L (recVal R)
============================
 lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
 < L'': case L'1.

Subgoal 2.4.1.2.1:

Variables: Hold SaveI Copy L HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
NEqEL : L = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : L = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (L, recVal R)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (L, recVal R)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (L, recVal R)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
L : Hold = L -> false
L' : SaveI = L -> false
============================
 lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (L, recVal R)]::R') (recVal R)
 < apply NEqEL to _.

Subgoal 2.4.1.2.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
L : Hold = L -> false
L' : SaveI = L -> false
L'' : SaveE = L -> false
L''1 : lookup [] L (recVal R)
============================
 lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
 < case L''1.

Subgoal 2.4.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L
LS'1 : lookupScopes L R' (recVal R)
============================
 lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
 < search.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < Sub: apply IH to ListyH2
          IsFE
          _
          ListyH1
          ListyH
          NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC LS''.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes L LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal R) LV
============================
 exists G' LV HFs',
   ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs' "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal HFs) LVal LV
 < exists G',
   LV,
   HFs'.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes L LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal R) LV
============================
 ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 lookup HFs' "null" trueVal) /\
 replaceScopes L LV G G') /\
 flipOnto (recVal HFs) LVal LV
 < split.

Subgoal 2.5:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes L LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal R) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
 < search 20.

Subgoal 2.6:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes L LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal R) LV
============================
 lookup HFs' "null" trueVal
 < search.

Subgoal 2.7:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes L LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal R) LV
============================
 replaceScopes L LV G G'
 < RS: case RS.

Subgoal 2.7.1:

Variables: Hold SaveI SaveE Copy V HFs LVal FE Names Tl Fields R' N G' LV HFs' I
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
RRVCopy : replaceRecVal "tail" LVal HFs HFs
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
H1 : is_value LVal
H2 : is_string Hold
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (name Copy)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) R'
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) HFs
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal HFs)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes Hold ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal HFs)
LS'' : lookupScopes Hold ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal HFs)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes Hold LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal HFs) LV
RS : mem (Hold, I) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
RS1 : remove_all [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
============================
 replaceScopes Hold LV R' G'
 < apply NEqHL to _.

Subgoal 2.7.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes L LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal R) LV
RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L
RS1 : replaceScopes L (recVal R) G R'
============================
 replaceScopes L LV G G'
 < apply replaceScopes_twice to RS1 Sub2.

Subgoal 2.7.2:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes L LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal R) LV
RS : no_lookup [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)] L
RS1 : replaceScopes L (recVal R) G R'
H9 : replaceScopes L LV G G'
============================
 replaceScopes L LV G G'
 < search.

Subgoal 2.8:

Variables: Hold SaveI SaveE Copy L V HFs LVal G FE Names Tl Fields R R' N G' LV HFs'
IH : forall Hold SaveI SaveE Copy L V HFs HoldL LVal G FE,
       listy HoldL * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ->
       lookup HFs "tail" HoldL -> lookup HFs "null" falseVal -> (Hold = SaveI ->
       false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) -> (SaveI = L ->
       false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
       false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy ->
       false) -> lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV HFs',
         ((<evalStmt {P}> FE ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs' "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto (recVal HFs) LVal LV
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
LkpTl : lookup HFs "tail" (recVal Fields)
LkpNl : lookup HFs "null" falseVal
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
LS : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) LVal
NamesCtx : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) Names
ListyH : lookup Fields "null" falseVal
ListyH1 : lookup Fields "tail" Tl
ListyH2 : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
EvBody1 : <evalStmt {P}> FE ([]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (declare intTy Copy (name Hold)) ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
RRVCopy : replaceRecVal "tail" LVal HFs R
EvBody2 : <evalStmt {P}> FE ([(Copy, recVal HFs)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) []
H1 : is_value LVal
H2 : is_string L
RS : replaceScopes L (recVal R) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')
EvBody3 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) []
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
Is : is_string Hold
H3 : is_list (is_pair is_string is_value) HFs
H4 : is_list (is_pair is_string is_value) R
H5 : names ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') N
EvBody4 : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R')) (assign Hold (tail (name Hold))) ([(Copy, recVal R)]::([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R')) []
H6 : is_list (is_pair is_string is_value) Fields
H7 : is_list (is_pair is_string is_value) [(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]
H8 : is_list (is_list (is_pair is_string is_value)) R'
LS' : lookupScopes L ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
LS'' : lookupScopes L ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (recVal R)
Sub : <evalStmt {P}> FE ([(Hold, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs' "null" trueVal
Sub2 : replaceScopes L LV R' G'
Sub3 : flipOnto (recVal Fields) (recVal R) LV
============================
 flipOnto (recVal HFs) LVal LV
 < search.

Proof completed.
 < Theorem proj_listUpdate_eval :
     forall OldL I (Hold : string) (SaveI : string) (SaveE : string) (Copy : string) (L : string) HoldL V NewL G FE,
       updateListIndex OldL I V NewL -> (Hold = SaveI -> false) -> (Hold = L -> false) ->
       (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) ->
       (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy ->
       false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV.

============================
 forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
   updateListIndex OldL I V NewL -> (Hold = SaveI -> false) -> (Hold = L -> false) ->
   (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) ->
   (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy ->
   false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
   is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
   exists G' LV HFs,
     ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     lookup HFs "null" trueVal) /\
     replaceScopes L LV G G') /\
     flipOnto HoldL NewL LV
 < induction on 1.

IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
============================
 forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
   updateListIndex OldL I V NewL @ -> (Hold = SaveI -> false) -> (Hold = L -> false) ->
   (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) ->
   (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy ->
   false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
   is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
   exists G' LV HFs,
     ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     lookup HFs "null" trueVal) /\
     replaceScopes L LV G G') /\
     flipOnto HoldL NewL LV
 < intros ULI NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC ListyH GEqI0 IsFE Is+ IsC LS.

Variables: OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
ULI : updateListIndex OldL I V NewL @
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL NewL LV
 < ULI: case ULI.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvLoop1: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [].

Subgoal 1.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
============================
 <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search 10.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvCheck: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [].

Subgoal 1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
============================
 <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
 < Names: apply names_exists to Is+.

Subgoal 1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
Names : names ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) N
============================
 <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search 10.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvMid: assert exists G',
     <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     replaceScopes L (recVal NewFields) G G'.

Subgoal 1.3:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (recVal NewFields) G G'
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 1.3:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string L
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (recVal NewFields) G G'
 < RS: apply lookupScopes_replaceScopes_exists to _ _ LS with
         V' = recVal NewFields.

Subgoal 1.3:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string L
RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) R
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (recVal NewFields) G G'
 < RS: case RS (keep).

Subgoal 1.3.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields I1 LRemain
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string L
RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, recVal NewFields)::LRemain)::G)
RS1 : mem (L, I1) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (recVal NewFields) G G'
 < M: case RS1.

Subgoal 1.3.1.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE NewFields Fields LRemain
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes Hold ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string Hold
RS : replaceScopes Hold (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((Hold, recVal NewFields)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Hold LRemain
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate Hold ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes Hold (recVal NewFields) G G'
 < apply NEqHL to _.

Subgoal 1.3.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields I1 LRemain
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string L
RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, recVal NewFields)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I1) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (recVal NewFields) G G'
 < M: case M.

Subgoal 1.3.1.2.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE NewFields Fields LRemain
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveI -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveI -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveI -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes SaveI ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string SaveI
RS : replaceScopes SaveI (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveI, recVal NewFields)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate SaveI ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes SaveI (recVal NewFields) G G'
 < apply NEqIL to _.

Subgoal 1.3.1.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields I1 LRemain
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string L
RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, recVal NewFields)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I1) [(SaveE, V)]
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (recVal NewFields) G G'
 < M: case M.

Subgoal 1.3.1.2.2.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE NewFields Fields LRemain
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveE -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveE -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveE -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveE -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string SaveE
RS : replaceScopes SaveE (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveE, recVal NewFields)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate SaveE ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes SaveE (recVal NewFields) G G'
 < apply NEqEL to _.

Subgoal 1.3.1.2.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields I1 LRemain
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string L
RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, recVal NewFields)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I1) []
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (recVal NewFields) G G'
 < case M.

Subgoal 1.3.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields New
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsL : is_value (recVal Fields)
IsL1 : is_string L
RS : replaceScopes L (recVal NewFields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L
RS2 : replaceScopes L (recVal NewFields) G New
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (recVal NewFields) G G'
 < search 20.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : exists G',
          <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
          replaceScopes L (recVal NewFields) G G'
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvMid: case EvMid.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE NewFields Fields G'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < ListyH': case ListyH (keep).

Subgoal 1.4:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < exists G',
   recVal NewFields,
   Fields1.

Subgoal 1.4:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 lookup Fields1 "null" trueVal) /\
 replaceScopes L (recVal NewFields) G G') /\
 flipOnto (recVal Fields1) (recVal NewFields) (recVal NewFields)
 < split.

Subgoal 1.4.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < unfold .

Subgoal 1.4.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G,
   [],
   [].

Subgoal 1.4.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\
 (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.4.1.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search.

Subgoal 1.4.1.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < unfold .

Subgoal 1.4.1.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G,
   [],
   [].

Subgoal 1.4.1.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\
 (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.4.1.2.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search.

Subgoal 1.4.1.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < unfold .

Subgoal 1.4.1.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G',
   [],
   [].

Subgoal 1.4.1.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.4.1.2.2.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < search.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < IsLV: apply lookupScopes_is to _ LS.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV : is_value (recVal Fields)
IsLV1 : is_string L
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < case IsLV.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < Is: case Is+.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is : is_list (is_pair is_string is_value) [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < Is: case Is.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < Is: case Is2.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < Is: case Is3.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is3 : is_pair is_string is_value (SaveE, V)
Is4 : is_list (is_pair is_string is_value) []
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < case Is3.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
H2 : is_string SaveE
H3 : is_value V
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < apply replaceRecVal_is to _ _ ULI1.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
H2 : is_string SaveE
H3 : is_value V
H4 : is_list (is_pair is_string is_value) NewFields
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < IsG': apply replaceScopes_is to _ _ EvMid1.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
H2 : is_string SaveE
H3 : is_value V
H4 : is_list (is_pair is_string is_value) NewFields
IsG' : is_list (is_list (is_pair is_string is_value)) G'
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < apply names_exists to IsG'.

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
H2 : is_string SaveE
H3 : is_value V
H4 : is_list (is_pair is_string is_value) NewFields
IsG' : is_list (is_list (is_pair is_string is_value)) G'
H5 : names G' N
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < assert (Hold::(SaveI::(SaveE::N))) |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null".

Subgoal 1.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
IsLV1 : is_string L
H1 : is_list (is_pair is_string is_value) Fields
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
H2 : is_string SaveE
H3 : is_value V
H4 : is_list (is_pair is_string is_value) NewFields
IsG' : is_list (is_list (is_pair is_string is_value)) G'
H5 : names G' N
H6 : (Hold::(SaveI::(SaveE::N))) |{expr}- null (name Hold) ~~> recFieldAccess (name Hold) "null"
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < search 20.

Subgoal 1.4.1.2.2.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 [] ++ [] = []
 < search.

Subgoal 1.4.1.2.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 [] ++ [] = []
 < search.

Subgoal 1.4.1.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 [] ++ [] = []
 < search.

Subgoal 1.4.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 lookup Fields1 "null" trueVal
 < search.

Subgoal 1.4.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 replaceScopes L (recVal NewFields) G G'
 < search.

Subgoal 1.4.4:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" trueVal
============================
 flipOnto (recVal Fields1) (recVal NewFields) (recVal NewFields)
 < search.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < LS': assert lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields).

Subgoal 1.5.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
============================
 lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
 < apply replaceScopes_lookupScopes_same to EvMid1.

Subgoal 1.5.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
H1 : lookupScopes L G' (recVal NewFields)
============================
 lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
 < search.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < Is: case Is+.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < Is: case Is.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < Is: case Is2.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < Is: case Is3.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is3 : is_pair is_string is_value (SaveE, V)
Is4 : is_list (is_pair is_string is_value) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < Is: case Is3.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < EvMid': apply drop_proj_rel_evalStmt to EvMid.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < apply lookupScopes_is to _ LS.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < apply evalStmt_isCtx to _ _ _ EvMid'.

Subgoal 1.5.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
============================
 is_stmt (recUpdate L ["head"] (name SaveE))
 < search 10.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < EvLoop2: apply eval_update_loop2 to _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ with
              Hold = Hold
              SaveI = SaveI
              SaveE = SaveE
              L = L
              V = V
              HoldL = Tl LVal = recVal NewFields G = G' FE = FE Copy = Copy.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto (recVal Fields1) (recVal NewFields) LV
 < exists G'1,
   LV,
   HFs'.

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 ((<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 lookup HFs' "null" trueVal) /\
 replaceScopes L LV G G'1) /\
 flipOnto (recVal Fields1) (recVal NewFields) LV
 < split.

Subgoal 1.5.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < unfold .

Subgoal 1.5.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G,
   [],
   [].

Subgoal 1.5.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\
 (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.5.3.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search.

Subgoal 1.5.3.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < unfold .

Subgoal 1.5.3.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G,
   [],
   [].

Subgoal 1.5.3.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\
 (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.5.3.2.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search.

Subgoal 1.5.3.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < unfold .

Subgoal 1.5.3.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G',
   [],
   [].

Subgoal 1.5.3.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 (<evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.5.3.2.2.1:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < search.

Subgoal 1.5.3.2.2.2:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < search.

Subgoal 1.5.3.2.2.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 [] ++ [] = []
 < search.

Subgoal 1.5.3.2.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 [] ++ [] = []
 < search.

Subgoal 1.5.3.3:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 [] ++ [] = []
 < search.

Subgoal 1.5.4:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 lookup HFs' "null" trueVal
 < search.

Subgoal 1.5.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 replaceScopes L LV G G'1
 < apply replaceScopes_twice to EvMid1 EvLoop4.

Subgoal 1.5.5:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
H4 : replaceScopes L LV G G'1
============================
 replaceScopes L LV G G'1
 < search.

Subgoal 1.5.6:

Variables: Hold SaveI SaveE Copy L V G FE NewFields Fields G' Tl Fields1 G'1 LV HFs'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields1)
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
EvLoop1 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCheck : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvMid1 : replaceScopes L (recVal NewFields) G G'
ListyH' : lookup Fields1 "null" falseVal
ListyH'1 : lookup Fields1 "tail" Tl
ListyH'2 : listy Tl
LS' : lookupScopes L ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (recVal NewFields)
IsL : is_value (recVal Fields)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, recVal Fields1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is4 : is_list (is_pair is_string is_value) []
Is3 : is_string SaveE
Is5 : is_value V
EvMid' : evalStmt FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_value (recVal Fields)
H2 : is_string L
H3 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, recVal Fields1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs'), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : lookup HFs' "null" trueVal
EvLoop4 : replaceScopes L LV G' G'1
EvLoop5 : flipOnto (recVal Fields1) (recVal NewFields) LV
============================
 flipOnto (recVal Fields1) (recVal NewFields) LV
 < search.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < GEqI1: apply updateListIndex_pos to ULI3.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvCond1: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [].

Subgoal 2.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
 < unfold .

Subgoal 2.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (eq (name SaveI) (num 0)) falseVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
 < unfold .

Subgoal 2.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 exists V1 EE1 O1 V2 O2,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) V1 EE1 O1 /\
   (<evalExpr {P}> FE EE1 (num 0) V2 ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) O2 /\
   ((V1 = V2 -> false) /\ O1 ++ O2 = []))
 < exists intVal I,
   [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G,
   [],
   intVal 0,
   [].

Subgoal 2.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) (intVal I) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] /\
 (<evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (num 0) (intVal 0) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [] /\
 ((intVal I = intVal 0 -> false) /\ [] ++ [] = []))
 < split.

Subgoal 2.1.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) (intVal I) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
 < search.

Subgoal 2.1.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (num 0) (intVal 0) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
 < search.

Subgoal 2.1.3:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 intVal I = intVal 0 -> false
 < Or: apply greatereq_integer_greater_or_eq to GEqI0.

Subgoal 2.1.3:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
Or : I > 0 \/ I = 0
============================
 intVal I = intVal 0 -> false
 < C: case Or.

Subgoal 2.1.3.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
C : I > 0
============================
 intVal I = intVal 0 -> false
 < intros E.

Subgoal 2.1.3.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
C : I > 0
E : intVal I = intVal 0
============================
 false
 < case E.

Subgoal 2.1.3.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : 0 - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
C : 0 > 0
============================
 false
 < apply greater_integer_not_eq to C.

Subgoal 2.1.3.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : 0 - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 intVal 0 = intVal 0 -> false
 < compute ULI1.

Subgoal 2.1.3.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : 0 - 1 = -1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl -1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : -1 >= 0
============================
 intVal 0 = intVal 0 -> false
 < LEq: case GEqI1.

Subgoal 2.1.3.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : 0 >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : 0 - 1 = -1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl -1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
LEq : 0 <= -1
============================
 intVal 0 = intVal 0 -> false
 < case LEq.

Subgoal 2.1.4:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
============================
 [] ++ [] = []
 < search.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvCond2: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [].

Subgoal 2.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
 < apply names_exists to Is+.

Subgoal 2.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
H1 : names ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) N
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
 < search.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvCond: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) [].

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvBodyA: assert <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [].

Subgoal 2.3:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.3:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 exists V1 EE1,
   <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) V1 EE1 [] /\
   replaceScopes SaveI V1 EE1 ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
 < exists intVal I1,
   []::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G).

Subgoal 2.3:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) [] /\
 replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
 < split.

Subgoal 2.3.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) []
 < search 20.

Subgoal 2.3.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
 < assert SaveE = SaveI -> false.

Subgoal 2.3.2.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
============================
 SaveE = SaveI -> false
 < intros E.

Subgoal 2.3.2.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
E : SaveE = SaveI
============================
 false
 < case E.

Subgoal 2.3.2.1:

Variables: I Hold SaveI Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveI -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveI -> false
NEqEL : SaveI = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveI = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) []
============================
 false
 < backchain NEqIE.

Subgoal 2.3.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
H1 : SaveE = SaveI -> false
============================
 replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
 < search 20.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvBodyB: assert <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [].

Subgoal 2.4:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.4:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (recVal Fields) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.4:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
 < LS: case LS.

Subgoal 2.4.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
LS : lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L (recVal Fields)
============================
 lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
 < L: case LS.

Subgoal 2.4.1.1:

Variables: I SaveI SaveE Copy L V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : L = SaveI -> false
NEqHL : L = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : L = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = L -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields)
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) []
============================
 lookupScopes L ([]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) (recVal Fields)
 < apply NEqHL to _.

Subgoal 2.4.1.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
L : Hold = L -> false
L1 : lookup [(SaveI, intVal I), (SaveE, V)] L (recVal Fields)
============================
 lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
 < L': case L1.

Subgoal 2.4.1.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
L : Hold = L -> false
L' : SaveI = L -> false
L'1 : lookup [(SaveE, V)] L (recVal Fields)
============================
 lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
 < L'': case L'1.

Subgoal 2.4.1.2.1:

Variables: I Hold SaveI Copy L HoldL G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
NEqEL : L = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : L = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 (recVal Fields) TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) []
L : Hold = L -> false
L' : SaveI = L -> false
============================
 lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) (recVal Fields)
 < apply NEqEL to _.

Subgoal 2.4.1.2.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
L : Hold = L -> false
L' : SaveI = L -> false
L'' : SaveE = L -> false
L''1 : lookup [] L (recVal Fields)
============================
 lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
 < case L''1.

Subgoal 2.4.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
LS : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
LS1 : lookupScopes L G (recVal Fields)
============================
 lookupScopes L ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
 < search 10.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < RRV: apply lookup_replaceRecVal_exists to ULI2 with
          V' = HoldL.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvBodyC: assert <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [].

Subgoal 2.5:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.5:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 exists V1 EE1 FieldVals NewVals,
   <evalExpr {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V1 EE1 [] /\
   (lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals) /\
   (updateRecFields ["tail"] V1 FieldVals NewVals /\
   replaceScopes Copy (recVal NewVals) EE1 ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))))
 < exists HoldL,
   [(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G),
   Fields,
   R.

Subgoal 2.5:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 <evalExpr {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] /\
 (lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields) /\
 (updateRecFields ["tail"] HoldL Fields R /\
 replaceScopes Copy (recVal R) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))))
 < split.

Subgoal 2.5.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 <evalExpr {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
 < assert SaveI = Hold -> false.

Subgoal 2.5.1.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 2.5.1.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 2.5.1.1:

Variables: I Hold SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = Hold -> false
NEqHL : Hold = L -> false
NEqIE : Hold = SaveE -> false
NEqIL : Hold = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : Hold = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (not (eq (name Hold) (num 0))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (and (not (eq (name Hold) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G)) (assign Hold (minus (name Hold) (num 1))) ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 false
 < backchain NEqHI.

Subgoal 2.5.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
H1 : SaveI = Hold -> false
============================
 <evalExpr {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
 < search.

Subgoal 2.5.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recVal Fields)
 < search.

Subgoal 2.5.3:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 updateRecFields ["tail"] HoldL Fields R
 < search.

Subgoal 2.5.4:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
============================
 replaceScopes Copy (recVal R) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
 < search.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvBodyD: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [].

Subgoal 2.6:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.6:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 exists V1 EE1,
   <evalExpr {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) V1 EE1 [] /\
   replaceScopes Hold V1 EE1 ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
 < exists recVal R,
   [(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G).

Subgoal 2.6:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] /\
 replaceScopes Hold (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
 < split.

Subgoal 2.6.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
 < search.

Subgoal 2.6.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 replaceScopes Hold (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
 < assert SaveI = Hold -> false.

Subgoal 2.6.2.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 2.6.2.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 2.6.2.1:

Variables: I Hold SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = Hold -> false
NEqHL : Hold = L -> false
NEqIE : Hold = SaveE -> false
NEqIL : Hold = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : Hold = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (not (eq (name Hold) (num 0))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (and (not (eq (name Hold) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G)) (assign Hold (minus (name Hold) (num 1))) ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
============================
 false
 < backchain NEqHI.

Subgoal 2.6.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
H1 : SaveI = Hold -> false
============================
 replaceScopes Hold (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
 < assert SaveE = Hold -> false.

Subgoal 2.6.2.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
H1 : SaveI = Hold -> false
============================
 SaveE = Hold -> false
 < intros E.

Subgoal 2.6.2.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
H1 : SaveI = Hold -> false
E : SaveE = Hold
============================
 false
 < case E.

Subgoal 2.6.2.2:

Variables: I Hold SaveI Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = Hold -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = Hold -> false
NEqEL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : Hold = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) []
H1 : SaveI = Hold -> false
============================
 false
 < backchain NEqHE.

Subgoal 2.6.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
H1 : SaveI = Hold -> false
H2 : SaveE = Hold -> false
============================
 replaceScopes Hold (recVal R) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G))
 < search 20.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < LS': assert lookupScopes L G (recVal Fields).

Subgoal 2.7:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
============================
 lookupScopes L G (recVal Fields)
 < LS: case LS.

Subgoal 2.7.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS : lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L (recVal Fields)
============================
 lookupScopes L G (recVal Fields)
 < L: case LS.

Subgoal 2.7.1.1:

Variables: I SaveI SaveE Copy L V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : L = SaveI -> false
NEqHL : L = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : L = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = L -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy (recVal Fields)
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(L, recVal Fields), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" (recVal Fields) Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (L, recVal Fields), (SaveE, V)]::G)) (assign L (name Copy)) ([(Copy, recVal R)]::([(L, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
============================
 lookupScopes L G (recVal Fields)
 < apply NEqHL to _.

Subgoal 2.7.1.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
L : Hold = L -> false
L1 : lookup [(SaveI, intVal I), (SaveE, V)] L (recVal Fields)
============================
 lookupScopes L G (recVal Fields)
 < L': case L1.

Subgoal 2.7.1.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
L : Hold = L -> false
L' : SaveI = L -> false
L'1 : lookup [(SaveE, V)] L (recVal Fields)
============================
 lookupScopes L G (recVal Fields)
 < L'': case L'1.

Subgoal 2.7.1.2.1:

Variables: I Hold SaveI Copy L HoldL G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
NEqEL : L = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : L = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 (recVal Fields) TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (L, recVal Fields)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (L, recVal Fields)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (L, recVal Fields)]::G)) []
L : Hold = L -> false
L' : SaveI = L -> false
============================
 lookupScopes L G (recVal Fields)
 < apply NEqEL to _.

Subgoal 2.7.1.2.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
L : Hold = L -> false
L' : SaveI = L -> false
L'' : SaveE = L -> false
L''1 : lookup [] L (recVal Fields)
============================
 lookupScopes L G (recVal Fields)
 < case L''1.

Subgoal 2.7.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
LS1 : lookupScopes L G (recVal Fields)
============================
 lookupScopes L G (recVal Fields)
 < search.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < apply lookupScopes_is to _ LS.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < Is: case Is+.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < apply lookupScopes_replaceScopes_exists to _ _ LS' with
     V' = Tl.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvBodyE: assert <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [].

Subgoal 2.8:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
============================
 <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
 < unfold .

Subgoal 2.8:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
============================
 exists V1 EE1,
   <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) V1 EE1 [] /\
   replaceScopes L V1 EE1 ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
 < exists Tl,
   [(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G).

Subgoal 2.8:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] /\
 replaceScopes L Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
 < split.

Subgoal 2.8.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < apply names_exists to Is1.

Subgoal 2.8.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
H4 : names G N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.8.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
H4 : names G N
============================
 exists Names E_P V_P EE_P O_P Fields,
   (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (name L) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] /\
   lookup Fields "tail" Tl) /\
   (names ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) Names /\
   (Names |{expr}- tail (name L) ~~> E_P /\
   <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) E_P V_P EE_P O_P))
 < exists Copy::(Hold::(SaveI::(SaveE::N))),
   recFieldAccess (name L) "tail",
   Tl,
   [(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G),
   [],
   Fields.

Subgoal 2.8.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
H4 : names G N
============================
 (<evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (name L) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) [] /\
 lookup Fields "tail" Tl) /\
 (names ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (Copy::(Hold::(SaveI::(SaveE::N)))) /\
 ((Copy::(Hold::(SaveI::(SaveE::N)))) |{expr}- tail (name L) ~~> recFieldAccess (name L) "tail" /\
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (recFieldAccess (name L) "tail") Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []))
 < split.

Subgoal 2.8.1.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
H4 : names G N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (name L) (recVal Fields) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < search 20.

Subgoal 2.8.1.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
H4 : names G N
============================
 lookup Fields "tail" Tl
 < search.

Subgoal 2.8.1.3:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
H4 : names G N
============================
 names ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (Copy::(Hold::(SaveI::(SaveE::N))))
 < search 10.

Subgoal 2.8.1.4:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
H4 : names G N
============================
 (Copy::(Hold::(SaveI::(SaveE::N)))) |{expr}- tail (name L) ~~> recFieldAccess (name L) "tail"
 < search.

Subgoal 2.8.1.5:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 N
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
H4 : names G N
============================
 <evalExpr {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (recFieldAccess (name L) "tail") Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < search 20.

Subgoal 2.8.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
============================
 replaceScopes L Tl ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
 < search 20.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBodyE : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvBody: assert <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) [].

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
RRV : replaceRecVal "tail" HoldL Fields R
EvBodyC : <evalStmt {P}> FE ([(Copy, recVal Fields)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) []
EvBodyD : <evalStmt {P}> FE ([(Copy, recVal R)]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) []
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBodyE : <evalStmt {P}> FE ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < clear EvBodyA
   EvBodyB
   EvBodyC
   EvBodyD
   EvBodyE.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < ListyH': assert listy (recVal R).

Subgoal 2.9:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
============================
 listy (recVal R)
 < apply replaceRecVal_lookup to RRV.

Subgoal 2.9:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H4 : lookup R "tail" HoldL
============================
 listy (recVal R)
 < apply replaceRecVal_lookup_other to RRV ULI _.

Subgoal 2.9:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H4 : lookup R "tail" HoldL
H5 : lookup R "null" falseVal
============================
 listy (recVal R)
 < search.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < Is: case Is.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is : is_pair is_string is_value (Hold, HoldL)
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < Is: case Is2.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is : is_pair is_string is_value (Hold, HoldL)
Is2 : is_pair is_string is_value (SaveI, intVal I)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < Is: case Is2.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is : is_pair is_string is_value (Hold, HoldL)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
Is2 : is_string SaveI
Is4 : is_value (intVal I)
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < case Is4.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is : is_pair is_string is_value (Hold, HoldL)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
Is2 : is_string SaveI
H4 : is_integer I
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < apply minus_integer_is_integer to _ _ ULI1.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is : is_pair is_string is_value (Hold, HoldL)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvBody': apply drop_proj_rel_evalStmt to EvBody.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is : is_pair is_string is_value (Hold, HoldL)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < case Is.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < Is: case Is3.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is : is_pair is_string is_value (SaveE, V)
Is3 : is_list (is_pair is_string is_value) []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < case Is.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < IsR1+: apply evalStmt_isCtx to _ _ _ EvBody'.

Subgoal 2.10:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
============================
 is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G))
 < search 10.

Subgoal 2.11:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
============================
 is_stmt (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))
 < search 20.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
IsR1+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < assert lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl.

Subgoal 2.12:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
IsR1+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
============================
 lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
 < apply replaceScopes_lookupScopes_same to H3.

Subgoal 2.12:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
IsR1+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
H10 : lookupScopes L R1 Tl
============================
 lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
 < search.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
IsR1+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1))
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < case IsR1+.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < Sub: apply IH to ULI3
          NEqHI
          NEqHL
          NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC ListyH' _ IsFE _ IsC _.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvSub: case Sub.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 O1 O2
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 O1
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') O2
EvSub2 : O1 ++ O2 = []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < case EvSub2.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < EvLoop1: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 [].

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
============================
 exists G' LV HFs,
   ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   lookup HFs "null" trueVal) /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (recVal NewFields) LV
 < exists G',
   LV,
   HFs.

Subgoal 2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
============================
 ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 lookup HFs "null" trueVal) /\
 replaceScopes L LV G G') /\
 flipOnto HoldL (recVal NewFields) LV
 < split.

Subgoal 2.13:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
============================
 <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
 < search.

Subgoal 2.14:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
============================
 lookup HFs "null" trueVal
 < search.

Subgoal 2.15:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
============================
 replaceScopes L LV G G'
 < apply replaceScopes_twice to H3 Sub2.

Subgoal 2.15:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
H13 : replaceScopes L LV G G'
============================
 replaceScopes L LV G G'
 < search.

Subgoal 2.16:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
Sub3 : flipOnto (recVal R) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
============================
 flipOnto HoldL (recVal NewFields) LV
 < FO: case Sub3.

Subgoal 2.16.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V LV *
ULI4 : replaceRecVal "tail" LV Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
FO : lookup R "null" trueVal
============================
 flipOnto HoldL (recVal NewFields) LV
 < L: apply replaceRecVal_lookup_other to RRV ULI _.

Subgoal 2.16.1:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V LV *
ULI4 : replaceRecVal "tail" LV Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
FO : lookup R "null" trueVal
L : lookup R "null" falseVal
============================
 flipOnto HoldL (recVal NewFields) LV
 < apply lookup_unique to FO L.

Subgoal 2.16.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 Fields' T
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
FO : lookup R "null" falseVal
FO1 : lookup R "tail" T
FO2 : replaceRecVal "tail" TlNew R Fields'
FO3 : flipOnto T (recVal Fields') LV
============================
 flipOnto HoldL (recVal NewFields) LV
 < L: apply replaceRecVal_lookup to RRV.

Subgoal 2.16.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 Fields' T
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
FO : lookup R "null" falseVal
FO1 : lookup R "tail" T
FO2 : replaceRecVal "tail" TlNew R Fields'
FO3 : flipOnto T (recVal Fields') LV
L : lookup R "tail" HoldL
============================
 flipOnto HoldL (recVal NewFields) LV
 < apply lookup_unique to FO1 L.

Subgoal 2.16.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 Fields'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
FO : lookup R "null" falseVal
FO1 : lookup R "tail" HoldL
FO2 : replaceRecVal "tail" TlNew R Fields'
FO3 : flipOnto HoldL (recVal Fields') LV
L : lookup R "tail" HoldL
============================
 flipOnto HoldL (recVal NewFields) LV
 < RRV': apply replaceRecVal_twice to RRV FO2.

Subgoal 2.16.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1 Fields'
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
FO : lookup R "null" falseVal
FO1 : lookup R "tail" HoldL
FO2 : replaceRecVal "tail" TlNew R Fields'
FO3 : flipOnto HoldL (recVal Fields') LV
L : lookup R "tail" HoldL
RRV' : replaceRecVal "tail" TlNew Fields Fields'
============================
 flipOnto HoldL (recVal NewFields) LV
 < apply replaceRecVal_unique to RRV' ULI4.

Subgoal 2.16.2:

Variables: I Hold SaveI SaveE Copy L HoldL V G FE I1 Tl TlNew NewFields Fields R R1 G' LV HFs EE1
IH : forall OldL I Hold SaveI SaveE Copy L HoldL V NewL G FE,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) ->
       (SaveI = Copy -> false) -> (SaveE = Copy -> false) -> listy HoldL -> I >= 0 ->
       is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV HFs,
         ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         lookup HFs "null" trueVal) /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
ListyH : listy HoldL
GEqI0 : I >= 0
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsC : is_string Copy
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields)
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
GEqI1 : I1 >= 0
EvCond1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond2 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (not (null (name L))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) []
RRV : replaceRecVal "tail" HoldL Fields R
LS' : lookupScopes L G (recVal Fields)
H1 : is_value (recVal Fields)
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
H3 : replaceScopes L Tl G R1
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
ListyH' : listy (recVal R)
Is2 : is_string SaveI
H4 : is_integer I
H5 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) ([(Copy, recVal R)]::([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)) []
H6 : is_string Hold
H7 : is_value HoldL
Is3 : is_list (is_pair is_string is_value) []
H8 : is_string SaveE
H9 : is_value V
H10 : lookupScopes L ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) Tl
H11 : is_list (is_pair is_string is_value) [(Copy, recVal R)]
H12 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1)
Sub1 : lookup HFs "null" trueVal
Sub2 : replaceScopes L LV R1 G'
EvSub : <evalStmt {P}> FE ([(Hold, recVal R), (SaveI, intVal I1), (SaveE, V)]::R1) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE1 []
FO : lookup R "null" falseVal
FO1 : lookup R "tail" HoldL
FO2 : replaceRecVal "tail" TlNew R NewFields
FO3 : flipOnto HoldL (recVal NewFields) LV
L : lookup R "tail" HoldL
RRV' : replaceRecVal "tail" TlNew Fields NewFields
============================
 flipOnto HoldL (recVal NewFields) LV
 < search.

Proof completed.
 < Theorem replaceScopes_lookupScopes_other  [Key, Item] :
     forall (X : Key) (XV : Item) L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV -> (X = Y -> false) -> lookupScopes Y R YV.

============================
 forall X XV L R Y YV,
   replaceScopes X XV L R -> lookupScopes Y L YV -> (X = Y -> false) -> lookupScopes Y R YV
 < induction on 2.

IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
============================
 forall X XV L R Y YV,
   replaceScopes X XV L R -> lookupScopes Y L YV @ -> (X = Y -> false) -> lookupScopes Y R YV
 < intros RS LS NEq.

Variables: X XV L R Y YV
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
RS : replaceScopes X XV L R
LS : lookupScopes Y L YV @
NEq : X = Y -> false
============================
 lookupScopes Y R YV
 < LS: case LS.

Subgoal 1:

Variables: X XV R Y YV Rest L1
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
RS : replaceScopes X XV (L1::Rest) R
NEq : X = Y -> false
LS : lookup L1 Y YV
============================
 lookupScopes Y R YV
 < RS: case RS.

Subgoal 1.1:

Variables: X XV Y YV Rest L1 I LRemain
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
NEq : X = Y -> false
LS : lookup L1 Y YV
RS : mem (X, I) L1
RS1 : remove_all L1 X LRemain
============================
 lookupScopes Y (((X, XV)::LRemain)::Rest) YV
 < apply remove_all_lookup_other_back to RS1 LS _.

Subgoal 1.1:

Variables: X XV Y YV Rest L1 I LRemain
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
NEq : X = Y -> false
LS : lookup L1 Y YV
RS : mem (X, I) L1
RS1 : remove_all L1 X LRemain
H1 : lookup LRemain Y YV
============================
 lookupScopes Y (((X, XV)::LRemain)::Rest) YV
 < search.

Subgoal 1.2:

Variables: X XV Y YV Rest L1 New
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
NEq : X = Y -> false
LS : lookup L1 Y YV
RS : no_lookup L1 X
RS1 : replaceScopes X XV Rest New
============================
 lookupScopes Y (L1::New) YV
 < search.

Subgoal 2:

Variables: X XV R Y YV Rest L1
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
RS : replaceScopes X XV (L1::Rest) R
NEq : X = Y -> false
LS : no_lookup L1 Y
LS1 : lookupScopes Y Rest YV *
============================
 lookupScopes Y R YV
 < RS: case RS.

Subgoal 2.1:

Variables: X XV Y YV Rest L1 I LRemain
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
NEq : X = Y -> false
LS : no_lookup L1 Y
LS1 : lookupScopes Y Rest YV *
RS : mem (X, I) L1
RS1 : remove_all L1 X LRemain
============================
 lookupScopes Y (((X, XV)::LRemain)::Rest) YV
 < apply remove_all_no_lookup_back to RS1 LS.

Subgoal 2.1:

Variables: X XV Y YV Rest L1 I LRemain
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
NEq : X = Y -> false
LS : no_lookup L1 Y
LS1 : lookupScopes Y Rest YV *
RS : mem (X, I) L1
RS1 : remove_all L1 X LRemain
H1 : no_lookup LRemain Y
============================
 lookupScopes Y (((X, XV)::LRemain)::Rest) YV
 < search.

Subgoal 2.2:

Variables: X XV Y YV Rest L1 New
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
NEq : X = Y -> false
LS : no_lookup L1 Y
LS1 : lookupScopes Y Rest YV *
RS : no_lookup L1 X
RS1 : replaceScopes X XV Rest New
============================
 lookupScopes Y (L1::New) YV
 < apply IH to RS1 LS1 _.

Subgoal 2.2:

Variables: X XV Y YV Rest L1 New
IH : forall X XV L R Y YV,
       replaceScopes X XV L R -> lookupScopes Y L YV * -> (X = Y -> false) -> lookupScopes Y R YV
NEq : X = Y -> false
LS : no_lookup L1 Y
LS1 : lookupScopes Y Rest YV *
RS : no_lookup L1 X
RS1 : replaceScopes X XV Rest New
H1 : lookupScopes Y New YV
============================
 lookupScopes Y (L1::New) YV
 < search.

Proof completed.
 < Theorem eval_update_loop2_listy :
     forall (Hold : string) (Copy : string) (L : string) FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV.

============================
 forall Hold Copy L FE G G' O LVal HVal,
   evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O ->
   (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
   lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV
 < induction on 1.

IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
============================
 forall Hold Copy L FE G G' O LVal HVal,
   evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O @ ->
   (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
   lookupScopes Hold G HVal -> exists LV, listy HVal /\ flipOnto HVal LVal LV
 < intros Ev NEqHL NEqCH NEqCL LL LH.

Variables: Hold Copy L FE G G' O LVal HVal
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
Ev : evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O @
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G LVal
LH : lookupScopes Hold G HVal
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < Ev: case Ev.

Subgoal 1:

Variables: Hold Copy L FE G G' O LVal HVal EE1 O2 Scope EE2 O3 O4 O12
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G LVal
LH : lookupScopes Hold G HVal
Ev : evalExpr FE G (not (null (name Hold))) trueVal EE1 O2 *
Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < clear Ev3
   Ev4.

Subgoal 1:

Variables: Hold Copy L FE G G' O LVal HVal EE1 O2 Scope EE2 O3 O4 O12
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G LVal
LH : lookupScopes Hold G HVal
Ev : evalExpr FE G (not (null (name Hold))) trueVal EE1 O2 *
Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < EvC: case Ev.

Subgoal 1:

Variables: Hold Copy L FE G G' O LVal HVal EE1 O2 Scope EE2 O3 O4 O12
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G LVal
LH : lookupScopes Hold G HVal
Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC : evalExpr FE G (null (name Hold)) falseVal EE1 O2 *
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < EvC: case EvC.

Subgoal 1:

Variables: Hold Copy L FE G G' O LVal HVal EE1 O2 Scope EE2 O3 O4 O12 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G LVal
LH : lookupScopes Hold G HVal
Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC : evalExpr FE G (name Hold) (recVal Fields) EE1 O2 *
EvC1 : lookup Fields "null" falseVal
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < LH': case EvC.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal HVal EE1 Scope EE2 O3 O4 O12 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 HVal
Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
LH' : lookupScopes Hold EE1 (recVal Fields)
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < apply lookupScopes_unique to LH' LH.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
LH' : lookupScopes Hold EE1 (recVal Fields)
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < clear LH'.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev1 : evalStmt FE ([]::EE1) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))) (Scope::EE2) O3 *
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < EvB: case Ev1.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 *
EvB1 : evalStmt FE EE3 (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) (Scope::EE2) O5 *
EvB2 : O1 ++ O5 = O3
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < clear EvB2.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 *
EvB1 : evalStmt FE EE3 (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))) (Scope::EE2) O5 *
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < EvB: case EvB1.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 EE4 O6 O7
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 *
EvB1 : evalStmt FE EE3 (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))) (Scope::EE2) O7 *
EvB3 : O6 ++ O7 = O5
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < clear EvB3.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 EE4 O6 O7
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 *
EvB1 : evalStmt FE EE3 (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))) (Scope::EE2) O7 *
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < EvB: case EvB2.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 EE4 O6 O7 EE5 O8 O9
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 *
EvB1 : evalStmt FE EE3 (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvB4 : O8 ++ O9 = O7
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < clear EvB4.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields EE3 O1 O5 EE4 O6 O7 EE5 O8 O9
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::EE1) (declare intTy Copy (name Hold)) EE3 O1 *
EvB1 : evalStmt FE EE3 (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < EvA: case EvB.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal EE1 Scope EE2 O3 O4 O12 Fields O1 O5 EE4 O6 O7 EE5 O8 O9 EE6 Scope1 V
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE1 LVal
LH : lookupScopes Hold EE1 (recVal Fields)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE (((Copy, V)::Scope1)::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA : evalExpr FE ([]::EE1) (name Hold) V (Scope1::EE6) O1 *
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < L: case EvA.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 Fields O5 EE4 O6 O7 EE5 O8 O9 EE6 V
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal Fields)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
L : lookupScopes Hold ([]::EE6) V
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < rename Fields to HFs.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
L : lookupScopes Hold ([]::EE6) V
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < Eq: assert V = recVal HFs.

Subgoal 1.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
L : lookupScopes Hold ([]::EE6) V
============================
 V = recVal HFs
 < L: case L.

Subgoal 1.1.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
L : lookup [] Hold V
============================
 V = recVal HFs
 < case L.

Subgoal 1.1.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
L : no_lookup [] Hold
L1 : lookupScopes Hold EE6 V
============================
 V = recVal HFs
 < apply lookupScopes_unique to L1 LH.

Subgoal 1.1.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB1 : evalStmt FE ([(Copy, recVal HFs)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
L : no_lookup [] Hold
L1 : lookupScopes Hold EE6 (recVal HFs)
============================
 recVal HFs = recVal HFs
 < search.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB1 : evalStmt FE ([(Copy, V)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
L : lookupScopes Hold ([]::EE6) V
Eq : V = recVal HFs
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < case Eq.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB1 : evalStmt FE ([(Copy, recVal HFs)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
L : lookupScopes Hold ([]::EE6) (recVal HFs)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < clear L.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB1 : evalStmt FE ([(Copy, recVal HFs)]::EE6) (recUpdate Copy ["tail"] (name L)) EE4 O6 *
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < EvA: case EvB1.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O6 O7 EE5 O8 O9 EE6 V1 EE7 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA : evalExpr FE ([(Copy, recVal HFs)]::EE6) (name L) V1 EE7 O6 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) EE7 EE4
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < LL': case EvA.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
LL' : lookupScopes L ([(Copy, recVal HFs)]::EE6) V1
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < Eq: assert V1 = LVal.

Subgoal 1.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
LL' : lookupScopes L ([(Copy, recVal HFs)]::EE6) V1
============================
 V1 = LVal
 < L: case LL'.

Subgoal 1.2.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
L : lookup [(Copy, recVal HFs)] L V1
============================
 V1 = LVal
 < L: case L.

Subgoal 1.2.1.1:

Variables: Hold L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : L = Hold -> false
NEqCL : L = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy L (name Hold)) (seq (recUpdate L ["tail"] (name L)) (seq (assign L (name L)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name L)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes L ([(L, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] (recVal HFs) FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(L, recVal HFs)]::EE6) EE4
============================
 recVal HFs = LVal
 < apply NEqCL to _.

Subgoal 1.2.1.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
L : Copy = L -> false
L1 : lookup [] L V1
============================
 V1 = LVal
 < case L1.

Subgoal 1.2.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
L : no_lookup [(Copy, recVal HFs)] L
L1 : lookupScopes L EE6 V1
============================
 V1 = LVal
 < apply lookupScopes_unique to L1 LL.

Subgoal 1.2.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
L : no_lookup [(Copy, recVal HFs)] L
L1 : lookupScopes L EE6 LVal
============================
 LVal = LVal
 < search.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 V1 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] V1 FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
LL' : lookupScopes L ([(Copy, recVal HFs)]::EE6) V1
Eq : V1 = LVal
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < case Eq.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
LL' : lookupScopes L ([(Copy, recVal HFs)]::EE6) LVal
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < clear LL'.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < Eq: assert FieldVals = HFs.

Subgoal 1.3:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
============================
 FieldVals = HFs
 < L: case EvA1.

Subgoal 1.3.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
L : lookup [(Copy, recVal HFs)] Copy (recVal FieldVals)
============================
 FieldVals = HFs
 < L: case L.

Subgoal 1.3.1.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal FieldVals)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup FieldVals "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::EE6) EE4
============================
 FieldVals = FieldVals
 < search.

Subgoal 1.3.1.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
L : Copy = Copy -> false
L1 : lookup [] Copy (recVal FieldVals)
============================
 FieldVals = HFs
 < apply L to _.

Subgoal 1.3.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
L : no_lookup [(Copy, recVal HFs)] Copy
L1 : lookupScopes Copy EE6 (recVal FieldVals)
============================
 FieldVals = HFs
 < N: case L.

Subgoal 1.3.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
L1 : lookupScopes Copy EE6 (recVal FieldVals)
N : Copy = Copy -> false
N1 : no_lookup [] Copy
============================
 FieldVals = HFs
 < apply N to _.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 FieldVals NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal FieldVals)
EvA2 : updateRecFields ["tail"] LVal FieldVals NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
Eq : FieldVals = HFs
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < case Eq.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA1 : lookupScopes Copy ([(Copy, recVal HFs)]::EE6) (recVal HFs)
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < clear EvA1.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < Eq: assert EE4 = [(Copy, recVal NewVals)]::EE6.

Subgoal 1.4:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
============================
 EE4 = [(Copy, recVal NewVals)]::EE6
 < RS: case EvA3.

Subgoal 1.4.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals I LRemain
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::EE6) (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS : mem (Copy, I) [(Copy, recVal HFs)]
RS1 : remove_all [(Copy, recVal HFs)] Copy LRemain
============================
 ((Copy, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE6
 < RA: case RS1.

Subgoal 1.4.1.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals I LRemain
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::EE6) (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS : mem (Copy, I) [(Copy, recVal HFs)]
RA : remove_all [] Copy LRemain
============================
 ((Copy, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE6
 < case RA.

Subgoal 1.4.1.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals I
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE ([(Copy, recVal NewVals)]::EE6) (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS : mem (Copy, I) [(Copy, recVal HFs)]
============================
 [(Copy, recVal NewVals)]::EE6 = [(Copy, recVal NewVals)]::EE6
 < search.

Subgoal 1.4.1.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals I R
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE (((Copy, recVal NewVals)::((Copy, recVal HFs)::R))::EE6) (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS : mem (Copy, I) [(Copy, recVal HFs)]
RA : Copy = Copy -> false
RA1 : remove_all [] Copy R
============================
 ((Copy, recVal NewVals)::((Copy, recVal HFs)::R))::EE6 = [(Copy, recVal NewVals)]::EE6
 < apply RA to _.

Subgoal 1.4.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals New
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE ([(Copy, recVal HFs)]::New) (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS : no_lookup [(Copy, recVal HFs)] Copy
RS1 : replaceScopes Copy (recVal NewVals) EE6 New
============================
 [(Copy, recVal HFs)]::New = [(Copy, recVal NewVals)]::EE6
 < N: case RS.

Subgoal 1.4.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals New
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE ([(Copy, recVal HFs)]::New) (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS1 : replaceScopes Copy (recVal NewVals) EE6 New
N : Copy = Copy -> false
N1 : no_lookup [] Copy
============================
 [(Copy, recVal HFs)]::New = [(Copy, recVal NewVals)]::EE6
 < apply N to _.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 EE4 O7 EE5 O8 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE EE4 (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) EE4
Eq : EE4 = [(Copy, recVal NewVals)]::EE6
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < case Eq.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB2 : evalStmt FE ([(Copy, recVal NewVals)]::EE6) (assign L (name Copy)) EE5 O8 *
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < EvL: case EvB2.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O8 O9 EE6 NewVals V2 EE8
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6)
EvL : evalExpr FE ([(Copy, recVal NewVals)]::EE6) (name Copy) V2 EE8 O8 *
EvL1 : replaceScopes L V2 EE8 EE5
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < LC: case EvL.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals V2
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6)
EvL1 : replaceScopes L V2 ([(Copy, recVal NewVals)]::EE6) EE5
LC : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) V2
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < LC': apply replaceScopes_lookupScopes to EvA3.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals V2
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6)
EvL1 : replaceScopes L V2 ([(Copy, recVal NewVals)]::EE6) EE5
LC : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) V2
LC' : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) (recVal NewVals)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < apply lookupScopes_unique to LC' LC.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvA3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal HFs)]::EE6) ([(Copy, recVal NewVals)]::EE6)
EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) EE5
LC : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) (recVal NewVals)
LC' : lookupScopes Copy ([(Copy, recVal NewVals)]::EE6) (recVal NewVals)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < clear LC
   LC'
   EvA3.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) EE5
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < Eq: assert exists EE',
     EE5 = [(Copy, recVal NewVals)]::EE' /\
     replaceScopes L (recVal NewVals) EE6 EE'.

Subgoal 1.5:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) EE5
============================
 exists EE',
   EE5 = [(Copy, recVal NewVals)]::EE' /\
   replaceScopes L (recVal NewVals) EE6 EE'
 < RS: case EvL1.

Subgoal 1.5.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals I LRemain
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE (((L, recVal NewVals)::LRemain)::EE6) (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS : mem (L, I) [(Copy, recVal NewVals)]
RS1 : remove_all [(Copy, recVal NewVals)] L LRemain
============================
 exists EE',
   ((L, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE' /\
   replaceScopes L (recVal NewVals) EE6 EE'
 < M: case RS.

Subgoal 1.5.1.1:

Variables: Hold Copy FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals LRemain
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = Copy -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Copy -> false
LL : lookupScopes Copy EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::EE6) (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS1 : remove_all [(Copy, recVal NewVals)] Copy LRemain
============================
 exists EE',
   ((Copy, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE' /\
   replaceScopes Copy (recVal NewVals) EE6 EE'
 < apply NEqCL to _.

Subgoal 1.5.1.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals I LRemain
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE (((L, recVal NewVals)::LRemain)::EE6) (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS1 : remove_all [(Copy, recVal NewVals)] L LRemain
M : mem (L, I) []
============================
 exists EE',
   ((L, recVal NewVals)::LRemain)::EE6 = [(Copy, recVal NewVals)]::EE' /\
   replaceScopes L (recVal NewVals) EE6 EE'
 < case M.

Subgoal 1.5.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals New
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE ([(Copy, recVal NewVals)]::New) (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RS : no_lookup [(Copy, recVal NewVals)] L
RS1 : replaceScopes L (recVal NewVals) EE6 New
============================
 exists EE',
   [(Copy, recVal NewVals)]::New = [(Copy, recVal NewVals)]::EE' /\
   replaceScopes L (recVal NewVals) EE6 EE'
 < search.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE5 O9 EE6 NewVals
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE EE5 (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) EE5
Eq : exists EE',
       EE5 = [(Copy, recVal NewVals)]::EE' /\
       replaceScopes L (recVal NewVals) EE6 EE'
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < RSL: case Eq.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals EE'
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE ([(Copy, recVal NewVals)]::EE') (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
EvL1 : replaceScopes L (recVal NewVals) ([(Copy, recVal NewVals)]::EE6) ([(Copy, recVal NewVals)]::EE')
RSL : replaceScopes L (recVal NewVals) EE6 EE'
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < clear EvL1.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals EE'
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvB3 : evalStmt FE ([(Copy, recVal NewVals)]::EE') (assign Hold (tail (name Hold))) (Scope::EE2) O9 *
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < EvH: case EvB3.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals EE' V3 EE9
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH : evalExpr FE ([(Copy, recVal NewVals)]::EE') (tail (name Hold)) V3 EE9 O9 *
EvH1 : replaceScopes Hold V3 EE9 (Scope::EE2)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < EvH: case EvH.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 O9 EE6 NewVals EE' V3 EE9 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 EE9 (Scope::EE2)
EvH : evalExpr FE ([(Copy, recVal NewVals)]::EE') (name Hold) (recVal Fields) EE9 O9 *
EvH2 : lookup Fields "tail" V3
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < LH+: case EvH.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
LH+ : lookupScopes Hold ([(Copy, recVal NewVals)]::EE') (recVal Fields)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < Eq: assert Fields = HFs /\
   lookupScopes Hold EE' (recVal HFs).

Subgoal 1.6:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
LH+ : lookupScopes Hold ([(Copy, recVal NewVals)]::EE') (recVal Fields)
============================
 Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
 < L: case LH+.

Subgoal 1.6.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
L : lookup [(Copy, recVal NewVals)] Hold (recVal Fields)
============================
 Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
 < L: case L.

Subgoal 1.6.1.1:

Variables: Hold L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Hold = Hold -> false
NEqCL : Hold = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs Fields
RSL : replaceScopes L (recVal Fields) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Hold, recVal Fields)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
============================
 Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
 < apply NEqCH to _.

Subgoal 1.6.1.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
L : Copy = Hold -> false
L1 : lookup [] Hold (recVal Fields)
============================
 Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
 < case L1.

Subgoal 1.6.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
L : no_lookup [(Copy, recVal NewVals)] Hold
L1 : lookupScopes Hold EE' (recVal Fields)
============================
 Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
 < assert L = Hold -> false.

Subgoal 1.6.2.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
L : no_lookup [(Copy, recVal NewVals)] Hold
L1 : lookupScopes Hold EE' (recVal Fields)
============================
 L = Hold -> false
 < intros E.

Subgoal 1.6.2.1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
L : no_lookup [(Copy, recVal NewVals)] Hold
L1 : lookupScopes Hold EE' (recVal Fields)
E : L = Hold
============================
 false
 < case E.

Subgoal 1.6.2.1:

Variables: Hold Copy FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
LL : lookupScopes Hold EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes Hold (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
L : no_lookup [(Copy, recVal NewVals)] Hold
L1 : lookupScopes Hold EE' (recVal Fields)
============================
 false
 < backchain NEqHL.

Subgoal 1.6.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
L : no_lookup [(Copy, recVal NewVals)] Hold
L1 : lookupScopes Hold EE' (recVal Fields)
H1 : L = Hold -> false
============================
 Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
 < LH': apply replaceScopes_lookupScopes_other to RSL LH _.

Subgoal 1.6.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
L : no_lookup [(Copy, recVal NewVals)] Hold
L1 : lookupScopes Hold EE' (recVal Fields)
H1 : L = Hold -> false
LH' : lookupScopes Hold EE' (recVal HFs)
============================
 Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
 < apply lookupScopes_unique to L1 LH'.

Subgoal 1.6.2:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup HFs "tail" V3
L : no_lookup [(Copy, recVal NewVals)] Hold
L1 : lookupScopes Hold EE' (recVal HFs)
H1 : L = Hold -> false
LH' : lookupScopes Hold EE' (recVal HFs)
============================
 HFs = HFs /\ lookupScopes Hold EE' (recVal HFs)
 < search.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup Fields "tail" V3
LH+ : lookupScopes Hold ([(Copy, recVal NewVals)]::EE') (recVal Fields)
Eq : Fields = HFs /\ lookupScopes Hold EE' (recVal HFs)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < LH': case Eq.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup HFs "tail" V3
LH+ : lookupScopes Hold ([(Copy, recVal NewVals)]::EE') (recVal HFs)
LH' : lookupScopes Hold EE' (recVal HFs)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < clear LH+.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < Eq: assert exists EE'',
     (Scope = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\
     replaceScopes Hold V3 EE' EE''.

Subgoal 1.7:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
============================
 exists EE'',
   (Scope = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\
   replaceScopes Hold V3 EE' EE''
 < RS: case EvH1.

Subgoal 1.7.1:

Variables: Hold Copy L FE G' O LVal EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals V3 I LRemain
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE2
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE2 (recVal HFs)
RS : mem (Hold, I) [(Copy, recVal NewVals)]
RS1 : remove_all [(Copy, recVal NewVals)] Hold LRemain
============================
 exists EE'',
   ((Hold, V3)::LRemain = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\
   replaceScopes Hold V3 EE2 EE''
 < M: case RS.

Subgoal 1.7.1.1:

Variables: Copy L FE G' O LVal EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals V3 LRemain
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Copy = L -> false
NEqCH : Copy = Copy -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Copy EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Copy))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Copy (tail (name Copy))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE2
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Copy EE2 (recVal HFs)
RS1 : remove_all [(Copy, recVal NewVals)] Copy LRemain
============================
 exists EE'',
   ((Copy, V3)::LRemain = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\
   replaceScopes Copy V3 EE2 EE''
 < apply NEqCH to _.

Subgoal 1.7.1.2:

Variables: Hold Copy L FE G' O LVal EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals V3 I LRemain
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE2
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE2 (recVal HFs)
RS1 : remove_all [(Copy, recVal NewVals)] Hold LRemain
M : mem (Hold, I) []
============================
 exists EE'',
   ((Hold, V3)::LRemain = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\
   replaceScopes Hold V3 EE2 EE''
 < case M.

Subgoal 1.7.2:

Variables: Hold Copy L FE G' O LVal EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : replaceScopes Hold V3 EE' EE2
============================
 exists EE'',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\
   replaceScopes Hold V3 EE' EE''
 < search.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal Scope EE2 O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE2 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') (Scope::EE2)
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
Eq : exists EE'',
       (Scope = [(Copy, recVal NewVals)] /\ EE2 = EE'') /\
       replaceScopes Hold V3 EE' EE''
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < RSH: case Eq.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE''
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH1 : replaceScopes Hold V3 ([(Copy, recVal NewVals)]::EE') ([(Copy, recVal NewVals)]::EE'')
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RSH : replaceScopes Hold V3 EE' EE''
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < clear EvH1.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE''
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RSH : replaceScopes Hold V3 EE' EE''
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < LL': apply replaceScopes_lookupScopes to RSL.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE''
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RSH : replaceScopes Hold V3 EE' EE''
LL' : lookupScopes L EE' (recVal NewVals)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < LL'': apply replaceScopes_lookupScopes_other to RSH LL' _.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE''
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RSH : replaceScopes Hold V3 EE' EE''
LL' : lookupScopes L EE' (recVal NewVals)
LL'' : lookupScopes L EE'' (recVal NewVals)
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < LH'': apply replaceScopes_lookupScopes to RSH.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE''
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RSH : replaceScopes Hold V3 EE' EE''
LL' : lookupScopes L EE' (recVal NewVals)
LL'' : lookupScopes L EE'' (recVal NewVals)
LH'' : lookupScopes Hold EE'' V3
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < Sub: apply IH to Ev2 NEqHL NEqCH NEqCL LL'' LH''.

Subgoal 1:

Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' LV
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
EvA2 : updateRecFields ["tail"] LVal HFs NewVals
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RSH : replaceScopes Hold V3 EE' EE''
LL' : lookupScopes L EE' (recVal NewVals)
LL'' : lookupScopes L EE'' (recVal NewVals)
LH'' : lookupScopes Hold EE'' V3
Sub : listy V3
Sub1 : flipOnto V3 (recVal NewVals) LV
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < URF: case EvA2.

Subgoal 1.8:

Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' LV
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RSH : replaceScopes Hold V3 EE' EE''
LL' : lookupScopes L EE' (recVal NewVals)
LL'' : lookupScopes L EE'' (recVal NewVals)
LH'' : lookupScopes Hold EE'' V3
Sub : listy V3
Sub1 : flipOnto V3 (recVal NewVals) LV
URF : replaceRecVal "tail" LVal HFs NewVals
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < search.

Subgoal 1.9:

Variables: Hold Copy L FE G' O LVal O3 O4 O12 HFs O5 O7 EE6 NewVals EE' V3 EE'' LV Fields1 Updated
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L EE6 LVal
LH : lookupScopes Hold EE6 (recVal HFs)
Ev2 : evalStmt FE EE'' (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O4 *
EvC1 : lookup HFs "null" falseVal
RSL : replaceScopes L (recVal NewVals) EE6 EE'
EvH2 : lookup HFs "tail" V3
LH' : lookupScopes Hold EE' (recVal HFs)
RSH : replaceScopes Hold V3 EE' EE''
LL' : lookupScopes L EE' (recVal NewVals)
LL'' : lookupScopes L EE'' (recVal NewVals)
LH'' : lookupScopes Hold EE'' V3
Sub : listy V3
Sub1 : flipOnto V3 (recVal NewVals) LV
URF : lookup HFs "tail" (recVal Fields1)
URF1 : updateRecFields [] LVal Fields1 Updated
URF2 : replaceRecVal "tail" (recVal Updated) HFs NewVals
============================
 exists LV, listy (recVal HFs) /\ flipOnto (recVal HFs) LVal LV
 < case URF1.

Subgoal 2:

Variables: Hold Copy L FE G G' O LVal HVal
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G LVal
LH : lookupScopes Hold G HVal
Ev : evalExpr FE G (not (null (name Hold))) falseVal G' O *
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < Ev: case Ev.

Subgoal 2:

Variables: Hold Copy L FE G G' O LVal HVal
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G LVal
LH : lookupScopes Hold G HVal
Ev : evalExpr FE G (null (name Hold)) trueVal G' O *
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < Ev: case Ev.

Subgoal 2:

Variables: Hold Copy L FE G G' O LVal HVal Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G LVal
LH : lookupScopes Hold G HVal
Ev : evalExpr FE G (name Hold) (recVal Fields) G' O *
Ev1 : lookup Fields "null" trueVal
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < L: case Ev.

Subgoal 2:

Variables: Hold Copy L FE G' LVal HVal Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G' LVal
LH : lookupScopes Hold G' HVal
Ev1 : lookup Fields "null" trueVal
L : lookupScopes Hold G' (recVal Fields)
============================
 exists LV, listy HVal /\ flipOnto HVal LVal LV
 < apply lookupScopes_unique to LH L.

Subgoal 2:

Variables: Hold Copy L FE G' LVal Fields
IH : forall Hold Copy L FE G G' O LVal HVal,
       evalStmt FE G (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) G' O * ->
       (Hold = L -> false) -> (Copy = Hold -> false) -> (Copy = L -> false) -> lookupScopes L G LVal ->
       lookupScopes Hold G HVal -> exists LV,
         listy HVal /\ flipOnto HVal LVal LV
NEqHL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
LL : lookupScopes L G' LVal
LH : lookupScopes Hold G' (recVal Fields)
Ev1 : lookup Fields "null" trueVal
L : lookupScopes Hold G' (recVal Fields)
============================
 exists LV, listy (recVal Fields) /\ flipOnto (recVal Fields) LVal LV
 < search.

Proof completed.
 < Theorem replaceRecVal_other_val :
     forall F VA L R VB,
       replaceRecVal F VA L R -> exists R', replaceRecVal F VB L R'.

============================
 forall F VA L R VB,
   replaceRecVal F VA L R -> exists R', replaceRecVal F VB L R'
 < induction on 1.

IH : forall F VA L R VB,
       replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R'
============================
 forall F VA L R VB,
   replaceRecVal F VA L R @ -> exists R', replaceRecVal F VB L R'
 < intros R.

Variables: F VA L R VB
IH : forall F VA L R VB,
       replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R'
R : replaceRecVal F VA L R @
============================
 exists R', replaceRecVal F VB L R'
 < R: case R.

Subgoal 1:

Variables: F VA VB Rest VOld
IH : forall F VA L R VB,
       replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R'
============================
 exists R', replaceRecVal F VB ((F, VOld)::Rest) R'
 < search.

Subgoal 2:

Variables: F VA VB RRest VO O Rest
IH : forall F VA L R VB,
       replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R'
R : F = O -> false
R1 : replaceRecVal F VA Rest RRest *
============================
 exists R', replaceRecVal F VB ((O, VO)::Rest) R'
 < apply IH to R1 with
     VB = VB.

Subgoal 2:

Variables: F VA VB RRest VO O Rest R'
IH : forall F VA L R VB,
       replaceRecVal F VA L R * -> exists R', replaceRecVal F VB L R'
R : F = O -> false
R1 : replaceRecVal F VA Rest RRest *
H1 : replaceRecVal F VB Rest R'
============================
 exists R', replaceRecVal F VB ((O, VO)::Rest) R'
 < search.

Proof completed.
 < Theorem proj_eval_listUpdate :
     forall OldL VI (Hold : string) (SaveI : string) (SaveE : string) (Copy : string) (L : string) HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (exactEval:host:and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL.

============================
 forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
   (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
   (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
   false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) ->
   is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
   is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 ->
   evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
   exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < induction on 15.

IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
============================
 forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
   (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
   (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> (Copy = Hold ->
   false) -> (Copy = L -> false) -> (SaveI = Copy -> false) -> (SaveE = Copy -> false) ->
   is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
   is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 @ ->
   evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
   exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < intros NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC IsFE IsG+ IsCopy LS EvW EvNL EvA.

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvW : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 @
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < EvW: case EvW.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Is: case IsG+ (keep).

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, VI), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Is: case Is.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, HoldL)
Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)]
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < case Is.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)]
H1 : is_string Hold
H2 : is_value HoldL
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Is: case Is2.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_pair is_string is_value (SaveI, VI)
Is2 : is_list (is_pair is_string is_value) [(SaveE, V)]
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Is: case Is.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is2 : is_list (is_pair is_string is_value) [(SaveE, V)]
Is : is_string SaveI
Is3 : is_value VI
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Is: case Is2.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
Is2 : is_pair is_string is_value (SaveE, V)
Is4 : is_list (is_pair is_string is_value) []
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < case Is2.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
Is4 : is_list (is_pair is_string is_value) []
H3 : is_string SaveE
H4 : is_value V
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < case Is4.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < apply lookupScopes_is to _ LS.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < apply evalExpr_isCtx to _ _ _ EvW.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Is++: apply evalStmt_isCtx to _ _ _ EvW1.

Subgoal 1.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 is_stmt (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))
 < search 20.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) trueVal EE1 O3 *
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < EvC: case EvW.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal EE3 O6 *
EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 *
EvC2 : O6 ++ O7 = O3
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < clear EvC2.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal EE3 O6 *
EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 *
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < EvC: case EvC.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 *
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (eq (name SaveI) (num 0)) falseVal EE3 O6 *
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < EvC: case EvC.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 V1 EE4 O8 V2 O9
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 *
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE4 O8 *
EvC2 : evalExpr FE EE4 (num 0) V2 EE3 O9 *
EvC3 : V1 = V2 -> false
EvC4 : O8 ++ O9 = O6
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < case EvC2.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 V1 O8
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 *
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE3 O8 *
EvC3 : V1 = intVal 0 -> false
EvC4 : O8 ++ [] = O6
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < clear EvC4.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 EE3 O6 O7 V1 O8
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE EE3 (not (null (name L))) trueVal EE1 O7 *
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE3 O8 *
EvC3 : V1 = intVal 0 -> false
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < LC: case EvC.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
LC : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Eq: assert V1 = VI.

Subgoal 1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
LC : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
============================
 V1 = VI
 < LS: case LC.

Subgoal 1.2.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
LS1 : lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI V1
============================
 V1 = VI
 < L: case LS1.

Subgoal 1.2.1.1:

Variables: OldL VI SaveI SaveE Copy L V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : SaveI = SaveI -> false
NEqHL : SaveI = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : SaveI = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = SaveI -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, V1), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string SaveI
H2 : is_value V1
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(SaveI, V1), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
============================
 V1 = VI
 < apply NEqHI to _.

Subgoal 1.2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
L : Hold = SaveI -> false
L1 : lookup [(SaveI, VI), (SaveE, V)] SaveI V1
============================
 V1 = VI
 < L: case L1.

Subgoal 1.2.1.2.1:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, V1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value V1
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, V1), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
L : Hold = SaveI -> false
============================
 V1 = V1
 < search.

Subgoal 1.2.1.2.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
L : Hold = SaveI -> false
L1 : SaveI = SaveI -> false
L2 : lookup [(SaveE, V)] SaveI V1
============================
 V1 = VI
 < L: case L2.

Subgoal 1.2.1.2.2.1:

Variables: OldL VI Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveI -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveI -> false
NEqEL : SaveI = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveI = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveI, V1)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveI)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveI
H4 : is_value V1
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveI, V1)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
L : Hold = SaveI -> false
L1 : SaveI = SaveI -> false
============================
 V1 = VI
 < apply L1 to _.

Subgoal 1.2.1.2.2.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
L : Hold = SaveI -> false
L1 : SaveI = SaveI -> false
L2 : SaveE = SaveI -> false
L3 : lookup [] SaveI V1
============================
 V1 = VI
 < case L3.

Subgoal 1.2.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
LS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI
LS2 : lookupScopes SaveI G V1
============================
 V1 = VI
 < N: case LS1.

Subgoal 1.2.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
LS2 : lookupScopes SaveI G V1
N : Hold = SaveI -> false
N1 : no_lookup [(SaveI, VI), (SaveE, V)] SaveI
============================
 V1 = VI
 < N: case N1.

Subgoal 1.2.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
LS2 : lookupScopes SaveI G V1
N : Hold = SaveI -> false
N1 : SaveI = SaveI -> false
N2 : no_lookup [(SaveE, V)] SaveI
============================
 V1 = VI
 < apply N1 to _.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : V1 = intVal 0 -> false
LC : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
Eq : V1 = VI
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < case Eq.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
EvW3 : O3 ++ O4 = O12
EvW4 : O12 ++ O5 = O1
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
EvC3 : VI = intVal 0 -> false
LC : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) VI
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < clear LC
   EvC3
   EvW4
   EvW3.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) trueVal EE1 O7 *
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < EvC: case EvC1.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal EE1 O7 *
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < EvC: case EvC.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 Scope EE2 O4 O5 O12 O6 O7 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::EE1) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) EE1
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name L) (recVal Fields) EE1 O7 *
EvC1 : lookup Fields "null" falseVal
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < LC: case EvC.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
LC : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields)
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Eq: assert OldL = recVal Fields.

Subgoal 1.3:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
LC : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields)
============================
 OldL = recVal Fields
 < L: case LC.

Subgoal 1.3.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
L : lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L (recVal Fields)
============================
 OldL = recVal Fields
 < L: case L.

Subgoal 1.3.1.1:

Variables: OldL VI SaveI SaveE Copy L V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : L = SaveI -> false
NEqHL : L = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : L = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = L -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(L, recVal Fields), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(L, recVal Fields), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string L
H2 : is_value (recVal Fields)
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(L, recVal Fields), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
============================
 OldL = recVal Fields
 < apply NEqHL to _.

Subgoal 1.3.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
L : Hold = L -> false
L1 : lookup [(SaveI, VI), (SaveE, V)] L (recVal Fields)
============================
 OldL = recVal Fields
 < L: case L1.

Subgoal 1.3.1.2.1:

Variables: OldL Hold SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = L -> false
NEqHL : Hold = L -> false
NEqIE : L = SaveE -> false
NEqIL : L = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : L = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, recVal Fields), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (L, recVal Fields), (SaveE, V)]::G)) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string L
Is3 : is_value (recVal Fields)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, recVal Fields), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
L : Hold = L -> false
============================
 OldL = recVal Fields
 < apply NEqIL to _.

Subgoal 1.3.1.2.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : lookup [(SaveE, V)] L (recVal Fields)
============================
 OldL = recVal Fields
 < L: case L2.

Subgoal 1.3.1.2.2.1:

Variables: OldL VI Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
NEqEL : L = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : L = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (L, recVal Fields)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name L)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (L, recVal Fields)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string L
H4 : is_value (recVal Fields)
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (L, recVal Fields)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
L : Hold = L -> false
L1 : SaveI = L -> false
============================
 OldL = recVal Fields
 < apply NEqEL to _.

Subgoal 1.3.1.2.2.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : SaveE = L -> false
L3 : lookup [] L (recVal Fields)
============================
 OldL = recVal Fields
 < case L3.

Subgoal 1.3.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
L : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L
L1 : lookupScopes L G (recVal Fields)
============================
 OldL = recVal Fields
 < apply lookupScopes_unique to LS L1.

Subgoal 1.3.2:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
L : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L
L1 : lookupScopes L G (recVal Fields)
============================
 recVal Fields = recVal Fields
 < search.

Subgoal 1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value OldL
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
LC : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields)
Eq : OldL = recVal Fields
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < case Eq.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
LC : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields)
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < clear LC.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))) (Scope::EE2) O4 *
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < EvB: case EvW1.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 *
EvB1 : evalStmt FE EE5 (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))) (Scope::EE2) O11 *
EvB2 : O10 ++ O11 = O4
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < EvB: case EvB1.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 *
EvB2 : O10 ++ O11 = O4
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))) (Scope::EE2) O14 *
EvB4 : O13 ++ O14 = O11
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < EvB: case EvB3.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 *
EvB2 : O10 ++ O11 = O4
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB4 : O13 ++ O14 = O11
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (seq (assign Hold (name Copy)) (assign L (tail (name L)))) (Scope::EE2) O16 *
EvB6 : O15 ++ O16 = O14
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < EvB: case EvB5.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 *
EvB2 : O10 ++ O11 = O4
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB4 : O13 ++ O14 = O11
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB6 : O15 ++ O16 = O14
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvB8 : O17 ++ O18 = O16
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < clear EvB8
   EvB4
   EvB2
   EvB6.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB : evalStmt FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) EE5 O10 *
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < EvX: case EvB.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 V3 EE9
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) V3 EE9 O10 *
EvX1 : replaceScopes SaveI V3 EE9 EE5
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < EvX: case EvX.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 EE10 O19 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (name SaveI) (intVal I1) EE10 O19 *
EvX2 : evalExpr FE EE10 (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
EvX4 : O19 ++ O20 = O10
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < LI: case EvX.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
EvX4 : [] ++ O20 = O10
LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (intVal I1)
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < clear EvX4.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (intVal I1)
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < Eq: assert VI = intVal I1.

Subgoal 1.4:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (intVal I1)
============================
 VI = intVal I1
 < LS: case LI.

Subgoal 1.4.1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : lookup [] SaveI (intVal I1)
============================
 VI = intVal I1
 < case LS1.

Subgoal 1.4.2:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
LS2 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (intVal I1)
============================
 VI = intVal I1
 < LS': case LS2.

Subgoal 1.4.2.1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
LS' : lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI (intVal I1)
============================
 VI = intVal I1
 < L: case LS'.

Subgoal 1.4.2.1.1:

Variables: VI SaveI SaveE Copy L V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : SaveI = SaveI -> false
NEqHL : SaveI = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : SaveI = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = SaveI -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal I1), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string SaveI
H2 : is_value (intVal I1)
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal I1), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name SaveI)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign SaveI (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(SaveI, intVal I1), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
============================
 VI = intVal I1
 < apply NEqHI to _.

Subgoal 1.4.2.1.2:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
L : Hold = SaveI -> false
L1 : lookup [(SaveI, VI), (SaveE, V)] SaveI (intVal I1)
============================
 VI = intVal I1
 < L: case L1.

Subgoal 1.4.2.1.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
L : Hold = SaveI -> false
============================
 intVal I1 = intVal I1
 < search.

Subgoal 1.4.2.1.2.2:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
L : Hold = SaveI -> false
L1 : SaveI = SaveI -> false
L2 : lookup [(SaveE, V)] SaveI (intVal I1)
============================
 VI = intVal I1
 < L: case L2.

Subgoal 1.4.2.1.2.2.1:

Variables: VI Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveI -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveI -> false
NEqEL : SaveI = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveI = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveI, intVal I1)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveI)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveI
H4 : is_value (intVal I1)
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveI, intVal I1)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveI, intVal I1)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
L : Hold = SaveI -> false
L1 : SaveI = SaveI -> false
============================
 VI = intVal I1
 < apply L1 to _.

Subgoal 1.4.2.1.2.2.2:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
L : Hold = SaveI -> false
L1 : SaveI = SaveI -> false
L2 : SaveE = SaveI -> false
L3 : lookup [] SaveI (intVal I1)
============================
 VI = intVal I1
 < case L3.

Subgoal 1.4.2.2:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
LS' : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI
LS'1 : lookupScopes SaveI G (intVal I1)
============================
 VI = intVal I1
 < N: case LS'.

Subgoal 1.4.2.2:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
LS'1 : lookupScopes SaveI G (intVal I1)
N : Hold = SaveI -> false
N1 : no_lookup [(SaveI, VI), (SaveE, V)] SaveI
============================
 VI = intVal I1
 < N: case N1.

Subgoal 1.4.2.2:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LS1 : no_lookup [] SaveI
LS'1 : lookupScopes SaveI G (intVal I1)
N : Hold = SaveI -> false
N1 : SaveI = SaveI -> false
N2 : no_lookup [(SaveE, V)] SaveI
============================
 VI = intVal I1
 < apply N1 to _.

Subgoal 1:

Variables: VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value VI
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (intVal I1)
Eq : VI = intVal I1
============================
 exists I NewL, VI = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
LI : lookupScopes SaveI ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (intVal I1)
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < clear LI.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 EE9 I1 I2 O20 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) EE9 EE5
EvX2 : evalExpr FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (num 1) (intVal I2) EE9 O20 *
EvX3 : I1 - I2 = I
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < case EvX2.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) EE5
EvX3 : I1 - 1 = I
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < rename EvX3 to Minus.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) EE5
Minus : I1 - 1 = I
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < Eq: assert EE5 = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G).

Subgoal 1.5:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) EE5
Minus : I1 - 1 = I
============================
 EE5 = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < RS: case EvX1.

Subgoal 1.5.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE (((SaveI, intVal I)::LRemain)::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : mem (SaveI, I3) []
RS1 : remove_all [] SaveI LRemain
============================
 ((SaveI, intVal I)::LRemain)::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < case RS.

Subgoal 1.5.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I New
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::New) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS1 : replaceScopes SaveI (intVal I) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G) New
============================
 []::New = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < RS': case RS1.

Subgoal 1.5.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::LRemain)::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]
RS'1 : remove_all [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] SaveI LRemain
============================
 []::(((SaveI, intVal I)::LRemain)::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < RA: case RS'1.

Subgoal 1.5.2.1.1:

Variables: SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : SaveI = SaveI -> false
NEqHL : SaveI = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : SaveI = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = SaveI -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string SaveI
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::LRemain)::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name SaveI)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign SaveI (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : mem (SaveI, I3) [(SaveI, HoldL), (SaveI, intVal I1), (SaveE, V)]
RA : remove_all [(SaveI, intVal I1), (SaveE, V)] SaveI LRemain
============================
 []::(((SaveI, intVal I)::LRemain)::G) = []::([(SaveI, intVal I), (SaveI, HoldL), (SaveE, V)]::G)
 < apply NEqHI to _.

Subgoal 1.5.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::R))::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]
RA : Hold = SaveI -> false
RA1 : remove_all [(SaveI, intVal I1), (SaveE, V)] SaveI R
============================
 []::(((SaveI, intVal I)::((Hold, HoldL)::R))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < RA: case RA1.

Subgoal 1.5.2.1.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::R))::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]
RA : Hold = SaveI -> false
RA1 : remove_all [(SaveE, V)] SaveI R
============================
 []::(((SaveI, intVal I)::((Hold, HoldL)::R))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < RA: case RA1.

Subgoal 1.5.2.1.2.1.1:

Variables: Hold SaveI Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveI -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveI -> false
NEqEL : SaveI = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveI = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveI, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveI)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveI
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveI, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::R))::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveI, V)]
RA : Hold = SaveI -> false
RA1 : remove_all [] SaveI R
============================
 []::(((SaveI, intVal I)::((Hold, HoldL)::R))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveI, V)]::G)
 < apply NEqIE to _.

Subgoal 1.5.2.1.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::((SaveE, V)::R1)))::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]
RA : Hold = SaveI -> false
RA1 : SaveE = SaveI -> false
RA2 : remove_all [] SaveI R1
============================
 []::(((SaveI, intVal I)::((Hold, HoldL)::((SaveE, V)::R1)))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < case RA2.

Subgoal 1.5.2.1.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]
RA : Hold = SaveI -> false
RA1 : SaveE = SaveI -> false
============================
 []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < search.

Subgoal 1.5.2.1.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I I3 R1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::(((SaveI, intVal I)::((Hold, HoldL)::((SaveI, intVal I1)::R1)))::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : mem (SaveI, I3) [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]
RA : Hold = SaveI -> false
RA1 : SaveI = SaveI -> false
RA2 : remove_all [(SaveE, V)] SaveI R1
============================
 []::(((SaveI, intVal I)::((Hold, HoldL)::((SaveI, intVal I1)::R1)))::G) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply RA1 to _.

Subgoal 1.5.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I New1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS' : no_lookup [(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)] SaveI
RS'1 : replaceScopes SaveI (intVal I) G New1
============================
 []::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < N: case RS'.

Subgoal 1.5.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I New1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS'1 : replaceScopes SaveI (intVal I) G New1
N : Hold = SaveI -> false
N1 : no_lookup [(SaveI, intVal I1), (SaveE, V)] SaveI
============================
 []::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < N: case N1.

Subgoal 1.5.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I New1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
RS : no_lookup [] SaveI
RS'1 : replaceScopes SaveI (intVal I) G New1
N : Hold = SaveI -> false
N1 : SaveI = SaveI -> false
N2 : no_lookup [(SaveE, V)] SaveI
============================
 []::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::New1) = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply N1 to _.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields EE5 O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE EE5 (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) EE5
Minus : I1 - 1 = I
Eq : EE5 = []::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
EvX1 : replaceScopes SaveI (intVal I) ([]::([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G))
Minus : I1 - 1 = I
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < clear EvX1.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 EE6 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB1 : evalStmt FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (declare intTy Copy (name L)) EE6 O13 *
EvB3 : evalStmt FE EE6 (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < EvX: case EvB1.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I EE11 Scope1 V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE (((Copy, V4)::Scope1)::EE11) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvX : evalExpr FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name L) V4 (Scope1::EE11) O13 *
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < Eq: assert (V4 = recVal Fields /\ Scope1 = []) /\
   EE11 = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G.

Subgoal 1.6:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I EE11 Scope1 V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE (((Copy, V4)::Scope1)::EE11) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvX : evalExpr FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name L) V4 (Scope1::EE11) O13 *
============================
 (V4 = recVal Fields /\ Scope1 = []) /\
 EE11 = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < L: case EvX.

Subgoal 1.6:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : lookupScopes L ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) V4
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < L: case L.

Subgoal 1.6.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : lookup [] L V4
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < case L.

Subgoal 1.6.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : lookupScopes L ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) V4
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < L: case L1.

Subgoal 1.6.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] L V4
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < L: case L1.

Subgoal 1.6.2.1.1:

Variables: Hold SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = L -> false
NEqHL : Hold = L -> false
NEqIE : L = SaveE -> false
NEqIL : L = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : L = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string L
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, intVal I)]::([(L, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
============================
 (intVal I = recVal Fields /\ [] = []) /\
 [(L, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(L, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < apply NEqIL to _.

Subgoal 1.6.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : SaveI = L -> false
L2 : lookup [(Hold, HoldL), (SaveE, V)] L V4
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < L: case L2.

Subgoal 1.6.2.1.2.1:

Variables: SaveI SaveE Copy L V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : L = SaveI -> false
NEqHL : L = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : L = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = L -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(L, V4), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string L
H2 : is_value V4
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(L, V4), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (L, V4), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name L)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign L (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : SaveI = L -> false
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (L, V4), (SaveE, V)]::G = [(SaveI, intVal I), (L, V4), (SaveE, V)]::G
 < apply NEqHL to _.

Subgoal 1.6.2.1.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : SaveI = L -> false
L2 : Hold = L -> false
L3 : lookup [(SaveE, V)] L V4
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < L: case L3.

Subgoal 1.6.2.1.2.2.1:

Variables: Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
NEqEL : L = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : L = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (L, V4)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name L)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string L
H4 : is_value V4
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (L, V4)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (L, V4)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : SaveI = L -> false
L2 : Hold = L -> false
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (L, V4)]::G = [(SaveI, intVal I), (Hold, HoldL), (L, V4)]::G
 < apply NEqEL to _.

Subgoal 1.6.2.1.2.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : SaveI = L -> false
L2 : Hold = L -> false
L3 : SaveE = L -> false
L4 : lookup [] L V4
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < case L4.

Subgoal 1.6.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, V4)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : no_lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] L
L2 : lookupScopes L G V4
============================
 (V4 = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < apply lookupScopes_unique to L2 LS.

Subgoal 1.6.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
L : no_lookup [] L
L1 : no_lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] L
L2 : lookupScopes L G (recVal Fields)
============================
 (recVal Fields = recVal Fields /\ [] = []) /\
 [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
 < search.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I EE11 Scope1 V4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE (((Copy, V4)::Scope1)::EE11) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvX : evalExpr FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name L) V4 (Scope1::EE11) O13 *
Eq : (V4 = recVal Fields /\ Scope1 = []) /\
     EE11 = [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvX : evalExpr FE ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name L) (recVal Fields) ([]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) O13 *
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < clear EvX.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB3 : evalStmt FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recUpdate Copy ["tail"] (name Hold)) EE7 O15 *
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < EvRC: case EvB3.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC1 : lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals)
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < Eq: assert Fields = FieldVals.

Subgoal 1.7:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC1 : lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals)
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
============================
 Fields = FieldVals
 < L: case EvRC1.

Subgoal 1.7.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
L : lookup [(Copy, recVal Fields)] Copy (recVal FieldVals)
============================
 Fields = FieldVals
 < L: case L.

Subgoal 1.7.1.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
============================
 FieldVals = FieldVals
 < search.

Subgoal 1.7.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
L : Copy = Copy -> false
L1 : lookup [] Copy (recVal FieldVals)
============================
 Fields = FieldVals
 < case L1.

Subgoal 1.7.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
L : no_lookup [(Copy, recVal Fields)] Copy
L1 : lookupScopes Copy ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) (recVal FieldVals)
============================
 Fields = FieldVals
 < N: case L.

Subgoal 1.7.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
L1 : lookupScopes Copy ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) (recVal FieldVals)
N : Copy = Copy -> false
N1 : no_lookup [] Copy
============================
 Fields = FieldVals
 < apply N to _.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 Fields O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal Fields)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal Fields)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup Fields "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC1 : lookupScopes Copy ([(Copy, recVal Fields)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals)
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
Eq : Fields = FieldVals
============================
 exists I NewL, intVal I1 = intVal I /\ updateListIndex (recVal Fields) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC1 : lookupScopes Copy ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (recVal FieldVals)
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < clear EvRC1.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Eq: assert V5 = HoldL /\
   EE12 = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G).

Subgoal 1.8:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
============================
 V5 = HoldL /\
 EE12 = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < EvH: case EvRC.

Subgoal 1.8:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
EvH : lookupScopes Hold ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) V5
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < L: case EvH.

Subgoal 1.8.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : lookup [(Copy, recVal FieldVals)] Hold V5
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < L: case L.

Subgoal 1.8.1.1:

Variables: Hold SaveI SaveE L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Hold = Hold -> false
NEqCL : Hold = L -> false
NEqIC : SaveI = Hold -> false
NEqEC : SaveE = Hold -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Hold
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Hold)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] (recVal FieldVals) FieldVals NewVals
EvRC3 : replaceScopes Hold (recVal NewVals) ([(Hold, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
============================
 recVal FieldVals = HoldL /\
 [(Hold, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Hold, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply NEqCH to _.

Subgoal 1.8.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : Copy = Hold -> false
L1 : lookup [] Hold V5
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < case L1.

Subgoal 1.8.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
L1 : lookupScopes Hold ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) V5
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < L: case L1.

Subgoal 1.8.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
L1 : lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] Hold V5
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < L: case L1.

Subgoal 1.8.2.1.1:

Variables: Hold SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = Hold -> false
NEqHL : Hold = L -> false
NEqIE : Hold = SaveE -> false
NEqIL : Hold = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : Hold = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name Hold) (num 0))) (not (null (name L)))) (seq (assign Hold (minus (name Hold) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string Hold
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] (intVal I) FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(Hold, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
============================
 intVal I = HoldL /\
 [(Copy, recVal FieldVals)]::([(Hold, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(Hold, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply NEqHI to _.

Subgoal 1.8.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
L1 : SaveI = Hold -> false
L2 : lookup [(Hold, HoldL), (SaveE, V)] Hold V5
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < L: case L2.

Subgoal 1.8.2.1.2.1:

Variables: Hold SaveI SaveE Copy L V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, V5), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value V5
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, V5), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, V5), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
L1 : SaveI = Hold -> false
============================
 V5 = V5 /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, V5), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, V5), (SaveE, V)]::G)
 < search.

Subgoal 1.8.2.1.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
L1 : SaveI = Hold -> false
L2 : Hold = Hold -> false
L3 : lookup [(SaveE, V)] Hold V5
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply L2 to _.

Subgoal 1.8.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
L1 : no_lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] Hold
L2 : lookupScopes Hold G V5
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < N: case L1.

Subgoal 1.8.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
L2 : lookupScopes Hold G V5
N : SaveI = Hold -> false
N1 : no_lookup [(Hold, HoldL), (SaveE, V)] Hold
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < N: case N1.

Subgoal 1.8.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O16 EE8 O17 O18 I1 I V5 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
L : no_lookup [(Copy, recVal FieldVals)] Hold
L2 : lookupScopes Hold G V5
N : SaveI = Hold -> false
N1 : Hold = Hold -> false
N2 : no_lookup [(SaveE, V)] Hold
============================
 V5 = HoldL /\
 [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply N1 to _.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I V5 EE12 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) V5 EE12 O15 *
EvRC2 : updateRecFields ["tail"] V5 FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) EE12 EE7
Eq : V5 = HoldL /\
     EE12 = [(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC : evalExpr FE ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) O15 *
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < clear EvRC.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Eq: assert EE7 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G).

Subgoal 1.9:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
============================
 EE7 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < RS: case EvRC3.

Subgoal 1.9.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : mem (Copy, I3) [(Copy, recVal FieldVals)]
RS1 : remove_all [(Copy, recVal FieldVals)] Copy LRemain
============================
 ((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < RA: case RS1.

Subgoal 1.9.1.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : mem (Copy, I3) [(Copy, recVal FieldVals)]
RA : remove_all [] Copy LRemain
============================
 ((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < case RA.

Subgoal 1.9.1.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals I3
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : mem (Copy, I3) [(Copy, recVal FieldVals)]
============================
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < search.

Subgoal 1.9.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals I3 R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE (((Copy, recVal NewVals)::((Copy, recVal FieldVals)::R))::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : mem (Copy, I3) [(Copy, recVal FieldVals)]
RA : Copy = Copy -> false
RA1 : remove_all [] Copy R
============================
 ((Copy, recVal NewVals)::((Copy, recVal FieldVals)::R))::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply RA to _.

Subgoal 1.9.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals New
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE ([(Copy, recVal FieldVals)]::New) (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal FieldVals)] Copy
RS1 : replaceScopes Copy (recVal NewVals) ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) New
============================
 [(Copy, recVal FieldVals)]::New = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < N: case RS.

Subgoal 1.9.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals New
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE ([(Copy, recVal FieldVals)]::New) (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS1 : replaceScopes Copy (recVal NewVals) ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) New
N : Copy = Copy -> false
N1 : no_lookup [] Copy
============================
 [(Copy, recVal FieldVals)]::New = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply N to _.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 EE7 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE EE7 (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE7
Eq : EE7 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvRC3 : replaceScopes Copy (recVal NewVals) ([(Copy, recVal FieldVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G))
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < clear EvRC3.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB5 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (name Copy)) EE8 O17 *
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < EvHC: case EvB5.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals V6 EE13
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC : evalExpr FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) V6 EE13 O17 *
EvHC1 : replaceScopes Hold V6 EE13 EE8
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Eq: assert V6 = recVal NewVals /\
   EE13 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G).

Subgoal 1.10:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals V6 EE13
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC : evalExpr FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) V6 EE13 O17 *
EvHC1 : replaceScopes Hold V6 EE13 EE8
============================
 V6 = recVal NewVals /\
 EE13 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < E: case EvHC.

Subgoal 1.10:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
E : lookupScopes Copy ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) V6
============================
 V6 = recVal NewVals /\
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < L: case E.

Subgoal 1.10.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
L : lookup [(Copy, recVal NewVals)] Copy V6
============================
 V6 = recVal NewVals /\
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < L: case L.

Subgoal 1.10.1.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
============================
 recVal NewVals = recVal NewVals /\
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < search.

Subgoal 1.10.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
L : Copy = Copy -> false
L1 : lookup [] Copy V6
============================
 V6 = recVal NewVals /\
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply L to _.

Subgoal 1.10.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
L : no_lookup [(Copy, recVal NewVals)] Copy
L1 : lookupScopes Copy ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) V6
============================
 V6 = recVal NewVals /\
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < N: case L.

Subgoal 1.10.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O18 I1 I FieldVals NewVals V6
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold V6 ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
L1 : lookupScopes Copy ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) V6
N : Copy = Copy -> false
N1 : no_lookup [] Copy
============================
 V6 = recVal NewVals /\
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
 < apply N to _.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals V6 EE13
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC : evalExpr FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) V6 EE13 O17 *
EvHC1 : replaceScopes Hold V6 EE13 EE8
Eq : V6 = recVal NewVals /\
     EE13 = [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC : evalExpr FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (name Copy) (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) O17 *
EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < clear EvHC.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Eq: assert EE8 = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G).

Subgoal 1.11:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
============================
 EE8 = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < RS: case EvHC1.

Subgoal 1.11.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE (((Hold, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : mem (Hold, I3) [(Copy, recVal NewVals)]
RS1 : remove_all [(Copy, recVal NewVals)] Hold LRemain
============================
 ((Hold, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < M: case RS.

Subgoal 1.11.1.1:

Variables: SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Copy = SaveI -> false
NEqHL : Copy = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Copy = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Copy -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Copy, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Copy)) (seq (assign Copy (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Copy
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Copy, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE (((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Copy, HoldL), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS1 : remove_all [(Copy, recVal NewVals)] Copy LRemain
============================
 ((Copy, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Copy, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(Copy, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < apply NEqCH to _.

Subgoal 1.11.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE (((Hold, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS1 : remove_all [(Copy, recVal NewVals)] Hold LRemain
M : mem (Hold, I3) []
============================
 ((Hold, recVal NewVals)::LRemain)::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < case M.

Subgoal 1.11.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals New
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::New) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : replaceScopes Hold (recVal NewVals) ([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G) New
============================
 [(Copy, recVal NewVals)]::New = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < RS: case RS1.

Subgoal 1.11.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::LRemain)::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]
RS2 : remove_all [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] Hold LRemain
============================
 [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::LRemain)::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < RA: case RS2.

Subgoal 1.11.2.1.1:

Variables: Hold SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = Hold -> false
NEqHL : Hold = L -> false
NEqIE : Hold = SaveE -> false
NEqIL : Hold = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : Hold = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name Hold) (num 0))) (not (null (name L)))) (seq (assign Hold (minus (name Hold) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string Hold
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (Hold, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::LRemain)::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : mem (Hold, I3) [(Hold, intVal I), (Hold, HoldL), (SaveE, V)]
RA : remove_all [(Hold, HoldL), (SaveE, V)] Hold LRemain
============================
 [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::LRemain)::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (Hold, intVal I), (SaveE, V)]::G)
 < apply NEqHI to _.

Subgoal 1.11.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]
RA : SaveI = Hold -> false
RA1 : remove_all [(Hold, HoldL), (SaveE, V)] Hold R
============================
 [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < RA: case RA1.

Subgoal 1.11.2.1.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]
RA : SaveI = Hold -> false
RA1 : remove_all [(SaveE, V)] Hold R
============================
 [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < RA: case RA1.

Subgoal 1.11.2.1.2.1.1:

Variables: Hold SaveI Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = Hold -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = Hold -> false
NEqEL : Hold = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : Hold = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (Hold, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name Hold)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string Hold
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (Hold, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (Hold, V)]
RA : SaveI = Hold -> false
RA1 : remove_all [] Hold R
============================
 [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::R))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (Hold, V)]::G)
 < apply NEqHE to _.

Subgoal 1.11.2.1.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::((SaveE, V)::R1)))::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]
RA : SaveI = Hold -> false
RA1 : SaveE = Hold -> false
RA2 : remove_all [] Hold R1
============================
 [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::((SaveE, V)::R1)))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < case RA2.

Subgoal 1.11.2.1.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]
RA : SaveI = Hold -> false
RA1 : SaveE = Hold -> false
============================
 [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < search.

Subgoal 1.11.2.1.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals I3 R1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::((Hold, HoldL)::R1)))::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : mem (Hold, I3) [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]
RA : SaveI = Hold -> false
RA1 : Hold = Hold -> false
RA2 : remove_all [(SaveE, V)] Hold R1
============================
 [(Copy, recVal NewVals)]::(((Hold, recVal NewVals)::((SaveI, intVal I)::((Hold, HoldL)::R1)))::G) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < apply RA1 to _.

Subgoal 1.11.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals New1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS1 : no_lookup [(SaveI, intVal I), (Hold, HoldL), (SaveE, V)] Hold
RS2 : replaceScopes Hold (recVal NewVals) G New1
============================
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < N: case RS1.

Subgoal 1.11.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals New1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS2 : replaceScopes Hold (recVal NewVals) G New1
N : SaveI = Hold -> false
N1 : no_lookup [(Hold, HoldL), (SaveE, V)] Hold
============================
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < N: case N1.

Subgoal 1.11.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals New1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS2 : replaceScopes Hold (recVal NewVals) G New1
N : SaveI = Hold -> false
N1 : Hold = Hold -> false
N2 : no_lookup [(SaveE, V)] Hold
============================
 [(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::New1) = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
 < apply N1 to _.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 EE8 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE EE8 (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) EE8
Eq : EE8 = [(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvHC1 : replaceScopes Hold (recVal NewVals) ([(Copy, recVal NewVals)]::([(SaveI, intVal I), (Hold, HoldL), (SaveE, V)]::G)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G))
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < clear EvHC1.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
EvB7 : evalStmt FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (assign L (tail (name L))) (Scope::EE2) O18 *
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < EvB: case EvB7.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals V7 EE14
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB : evalExpr FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (tail (name L)) V7 EE14 O18 *
EvB1 : replaceScopes L V7 EE14 (Scope::EE2)
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Ev: case EvB.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 O18 I1 I FieldVals NewVals V7 EE14 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 EE14 (Scope::EE2)
Ev : evalExpr FE ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (name L) (recVal Fields1) EE14 O18 *
Ev1 : lookup Fields1 "tail" V7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < LSL: case Ev.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : lookupScopes L ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (recVal Fields1)
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Eq: assert Fields1 = FieldVals.

Subgoal 1.12:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : lookupScopes L ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (recVal Fields1)
============================
 Fields1 = FieldVals
 < LSL: case LSL.

Subgoal 1.12.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : lookup [(Copy, recVal NewVals)] L (recVal Fields1)
============================
 Fields1 = FieldVals
 < L: case LSL.

Subgoal 1.12.1.1:

Variables: Hold SaveI SaveE L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : L = Hold -> false
NEqCL : L = L -> false
NEqIC : SaveI = L -> false
NEqEC : SaveE = L -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string L
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy L (name L)) (seq (recUpdate L ["tail"] (name Hold)) (seq (assign Hold (name L)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals Fields1
EvB1 : replaceScopes L V7 ([(L, recVal Fields1)]::([(Hold, recVal Fields1), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
============================
 Fields1 = FieldVals
 < apply NEqCL to _.

Subgoal 1.12.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
L : Copy = L -> false
L1 : lookup [] L (recVal Fields1)
============================
 Fields1 = FieldVals
 < case L1.

Subgoal 1.12.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : no_lookup [(Copy, recVal NewVals)] L
LSL1 : lookupScopes L ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) (recVal Fields1)
============================
 Fields1 = FieldVals
 < LS': case LSL1.

Subgoal 1.12.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : no_lookup [(Copy, recVal NewVals)] L
LS' : lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L (recVal Fields1)
============================
 Fields1 = FieldVals
 < L: case LS'.

Subgoal 1.12.2.1.1:

Variables: SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : L = SaveI -> false
NEqHL : L = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : L = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = L -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(L, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string L
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(L, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals Fields1
EvB1 : replaceScopes L V7 ([(Copy, recVal Fields1)]::([(L, recVal Fields1), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : no_lookup [(Copy, recVal Fields1)] L
============================
 Fields1 = FieldVals
 < apply NEqHL to _.

Subgoal 1.12.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : no_lookup [(Copy, recVal NewVals)] L
L : Hold = L -> false
L1 : lookup [(SaveI, intVal I), (SaveE, V)] L (recVal Fields1)
============================
 Fields1 = FieldVals
 < L: case L1.

Subgoal 1.12.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : no_lookup [(Copy, recVal NewVals)] L
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : lookup [(SaveE, V)] L (recVal Fields1)
============================
 Fields1 = FieldVals
 < L: case L2.

Subgoal 1.12.2.1.2.1:

Variables: Hold SaveI Copy L HoldL G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
NEqEL : L = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : L = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (L, recVal Fields1)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name L)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string L
H4 : is_value (recVal Fields1)
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (L, recVal Fields1)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (L, recVal Fields1)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : no_lookup [(Copy, recVal NewVals)] L
L : Hold = L -> false
L1 : SaveI = L -> false
============================
 Fields1 = FieldVals
 < apply NEqEL to _.

Subgoal 1.12.2.1.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : no_lookup [(Copy, recVal NewVals)] L
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : SaveE = L -> false
L3 : lookup [] L (recVal Fields1)
============================
 Fields1 = FieldVals
 < case L3.

Subgoal 1.12.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : no_lookup [(Copy, recVal NewVals)] L
LS' : no_lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L
LS'1 : lookupScopes L G (recVal Fields1)
============================
 Fields1 = FieldVals
 < apply lookupScopes_unique to LS'1 LS.

Subgoal 1.12.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup FieldVals "tail" V7
LSL : no_lookup [(Copy, recVal NewVals)] L
LS' : no_lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L
LS'1 : lookupScopes L G (recVal FieldVals)
============================
 FieldVals = FieldVals
 < search.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 Fields1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup Fields1 "tail" V7
LSL : lookupScopes L ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (recVal Fields1)
Eq : Fields1 = FieldVals
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup FieldVals "tail" V7
LSL : lookupScopes L ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (recVal FieldVals)
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < clear LSL.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup FieldVals "tail" V7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Eq: assert exists G',
     (Scope = [(Copy, recVal NewVals)] /\
     EE2 = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
     lookupScopes L G' V7.

Subgoal 1.13:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup FieldVals "tail" V7
============================
 exists G',
   (Scope = [(Copy, recVal NewVals)] /\
   EE2 = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < RS: case EvB1.

Subgoal 1.13.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (((L, V7)::LRemain)::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : mem (L, I3) [(Copy, recVal NewVals)]
RS1 : remove_all [(Copy, recVal NewVals)] L LRemain
============================
 exists G',
   ((L, V7)::LRemain = [(Copy, recVal NewVals)] /\
   [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < M: case RS.

Subgoal 1.13.1.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Copy -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Copy -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Copy -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Copy -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes Copy G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name Copy)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate Copy ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name Copy)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Copy)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Copy (tail (name Copy)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string Copy
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (((Copy, V7)::LRemain)::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS1 : remove_all [(Copy, recVal NewVals)] Copy LRemain
============================
 exists G',
   ((Copy, V7)::LRemain = [(Copy, recVal NewVals)] /\
   [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes Copy G' V7
 < apply NEqCL to _.

Subgoal 1.13.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (((L, V7)::LRemain)::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS1 : remove_all [(Copy, recVal NewVals)] L LRemain
M : mem (L, I3) []
============================
 exists G',
   ((L, V7)::LRemain = [(Copy, recVal NewVals)] /\
   [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < case M.

Subgoal 1.13.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] L
RS1 : replaceScopes L V7 ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G) EE2
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   EE2 = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < RS: case RS1.

Subgoal 1.13.2.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE (((L, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((L, V7)::LRemain)::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] L
RS1 : mem (L, I3) [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]
RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LRemain
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   ((L, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < M: case RS1.

Subgoal 1.13.2.1.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes Hold G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name Hold)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate Hold ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE (((Hold, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string Hold
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((Hold, V7)::LRemain)::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] Hold
RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] Hold LRemain
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   ((Hold, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes Hold G' V7
 < apply NEqHL to _.

Subgoal 1.13.2.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE (((L, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((L, V7)::LRemain)::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] L
RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LRemain
M : mem (L, I3) [(SaveI, intVal I), (SaveE, V)]
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   ((L, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < M: case M.

Subgoal 1.13.2.1.2.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveI -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveI -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveI -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes SaveI G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name SaveI)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate SaveI ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE (((SaveI, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string SaveI
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((SaveI, V7)::LRemain)::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] SaveI
RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] SaveI LRemain
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   ((SaveI, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes SaveI G' V7
 < apply NEqIL to _.

Subgoal 1.13.2.1.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE (((L, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((L, V7)::LRemain)::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] L
RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LRemain
M : mem (L, I3) [(SaveE, V)]
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   ((L, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < M: case M.

Subgoal 1.13.2.1.2.2.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveE -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveE -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveE -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveE -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes SaveE G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name SaveE)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate SaveE ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE (((SaveE, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string SaveE
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((SaveE, V7)::LRemain)::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] SaveE
RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] SaveE LRemain
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   ((SaveE, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes SaveE G' V7
 < apply NEqEL to _.

Subgoal 1.13.2.1.2.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 I3 LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE (((L, V7)::LRemain)::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::(((L, V7)::LRemain)::G))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] L
RS2 : remove_all [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L LRemain
M : mem (L, I3) []
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   ((L, V7)::LRemain)::G = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < case M.

Subgoal 1.13.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 New
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] L
RS1 : no_lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L V7 G New
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < apply replaceScopes_lookupScopes to RS2.

Subgoal 1.13.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 New
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
RS : no_lookup [(Copy, recVal NewVals)] L
RS1 : no_lookup [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L V7 G New
H8 : lookupScopes L New V7
============================
 exists G',
   ([(Copy, recVal NewVals)] = [(Copy, recVal NewVals)] /\
   [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::New = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
   lookupScopes L G' V7
 < search.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 Scope EE2 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE EE2 (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) (Scope::EE2)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) (Scope::EE2)
Ev1 : lookup FieldVals "tail" V7
Eq : exists G',
       (Scope = [(Copy, recVal NewVals)] /\
       EE2 = [(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') /\
       lookupScopes L G' V7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < LS': case Eq.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 G'
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G'))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
EvB1 : replaceScopes L V7 ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G'))
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < clear EvB1.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 G'
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
Is++ : is_list (is_list (is_pair is_string is_value)) ([(Copy, recVal NewVals)]::([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G'))
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < case Is++.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 I FieldVals NewVals V7 G'
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)]
H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I), (SaveE, V)]::G')
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < ULI: apply IH to NEqHI
          NEqHL
          NEqIE
          NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC IsFE _ IsCopy LS' EvW2 _ EvA.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I3
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)]
H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G')
ULI : updateListIndex V7 I3 V NewL
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < RRV: assert replaceRecVal "tail" HoldL FieldVals NewVals.

Subgoal 1.14:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I3
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)]
H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G')
ULI : updateListIndex V7 I3 V NewL
============================
 replaceRecVal "tail" HoldL FieldVals NewVals
 < RRV: case EvRC2.

Subgoal 1.14.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I3
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)]
H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G')
ULI : updateListIndex V7 I3 V NewL
RRV : replaceRecVal "tail" HoldL FieldVals NewVals
============================
 replaceRecVal "tail" HoldL FieldVals NewVals
 < search.

Subgoal 1.14.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL Fields2 Updated
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I3
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)]
H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G')
ULI : updateListIndex V7 I3 V NewL
RRV : lookup FieldVals "tail" (recVal Fields2)
RRV1 : updateRecFields [] HoldL Fields2 Updated
RRV2 : replaceRecVal "tail" (recVal Updated) FieldVals NewVals
============================
 replaceRecVal "tail" HoldL FieldVals NewVals
 < case RRV1.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I3
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)]
H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G')
ULI : updateListIndex V7 I3 V NewL
RRV : replaceRecVal "tail" HoldL FieldVals NewVals
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < RRV': apply replaceRecVal_other_val to RRV with
           VB = NewL.

Subgoal 1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 O5 O12 O6 O10 O11 O13 O14 O15 O16 O17 I1 FieldVals NewVals V7 G' I3 NewL R'
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW2 : evalStmt FE ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G') (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O5 *
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_string Hold
H2 : is_value HoldL
Is : is_string SaveI
Is3 : is_value (intVal I1)
H3 : is_string SaveE
H4 : is_value V
H5 : is_value (recVal FieldVals)
H6 : is_string L
H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
EvC1 : lookup FieldVals "null" falseVal
Minus : I1 - 1 = I3
EvRC2 : updateRecFields ["tail"] HoldL FieldVals NewVals
Ev1 : lookup FieldVals "tail" V7
LS' : lookupScopes L G' V7
H8 : is_list (is_pair is_string is_value) [(Copy, recVal NewVals)]
H9 : is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal NewVals), (SaveI, intVal I3), (SaveE, V)]::G')
ULI : updateListIndex V7 I3 V NewL
RRV : replaceRecVal "tail" HoldL FieldVals NewVals
RRV' : replaceRecVal "tail" NewL FieldVals R'
============================
 exists I NewL,
   intVal I1 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < search.

Subgoal 2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) falseVal G1 O1 *
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < Eq: assert VI = intVal 0 /\
   G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G.

Subgoal 2.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) falseVal G1 O1 *
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < EvC: case EvW.

Subgoal 2.1.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) falseVal G1 O1 *
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < EvC: case EvC.

Subgoal 2.1.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (eq (name SaveI) (num 0)) trueVal G1 O1 *
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < EvC: case EvC.

Subgoal 2.1.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 V1 EE1 O3 O4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE1 O3 *
EvC1 : evalExpr FE EE1 (num 0) V1 G1 O4 *
EvC2 : O3 ++ O4 = O1
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < case EvC1.

Subgoal 2.1.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) (intVal 0) G1 O3 *
EvC2 : O3 ++ [] = O1
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < L: case EvC.

Subgoal 2.1.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
L : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (intVal 0)
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < L: case L.

Subgoal 2.1.1.1:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
L : lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI (intVal 0)
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < L: case L.

Subgoal 2.1.1.1.1:

Variables: OldL VI SaveI SaveE Copy L V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : SaveI = SaveI -> false
NEqHL : SaveI = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : SaveI = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = SaveI -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
============================
 VI = intVal 0 /\
 [(SaveI, intVal 0), (SaveI, VI), (SaveE, V)]::G = [(SaveI, intVal 0), (SaveI, intVal 0), (SaveE, V)]::G
 < apply NEqHI to _.

Subgoal 2.1.1.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
L : Hold = SaveI -> false
L1 : lookup [(SaveI, VI), (SaveE, V)] SaveI (intVal 0)
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < L: case L1.

Subgoal 2.1.1.1.2.1:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
L : Hold = SaveI -> false
============================
 intVal 0 = intVal 0 /\
 [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < search.

Subgoal 2.1.1.1.2.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
L : Hold = SaveI -> false
L1 : SaveI = SaveI -> false
L2 : lookup [(SaveE, V)] SaveI (intVal 0)
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < apply L1 to _.

Subgoal 2.1.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
L : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI
L1 : lookupScopes SaveI G (intVal 0)
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < N: case L.

Subgoal 2.1.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
L1 : lookupScopes SaveI G (intVal 0)
N : Hold = SaveI -> false
N1 : no_lookup [(SaveI, VI), (SaveE, V)] SaveI
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < N: case N1.

Subgoal 2.1.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : [] ++ [] = O1
L1 : lookupScopes SaveI G (intVal 0)
N : Hold = SaveI -> false
N1 : SaveI = SaveI -> false
N2 : no_lookup [(SaveE, V)] SaveI
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < apply N1 to _.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 O4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (eq (name SaveI) (num 0))) trueVal EE1 O3 *
EvC1 : evalExpr FE EE1 (not (null (name L))) falseVal G1 O4 *
EvC2 : O3 ++ O4 = O1
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < EvN: case EvC.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 O4
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC1 : evalExpr FE EE1 (not (null (name L))) falseVal G1 O4 *
EvC2 : O3 ++ O4 = O1
EvN : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (eq (name SaveI) (num 0)) falseVal EE1 O3 *
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < EvN: case EvN.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 O4 V1 EE2 O5 V2 O6
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC1 : evalExpr FE EE1 (not (null (name L))) falseVal G1 O4 *
EvC2 : O3 ++ O4 = O1
EvN : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE2 O5 *
EvN1 : evalExpr FE EE2 (num 0) V2 EE1 O6 *
EvN2 : V1 = V2 -> false
EvN3 : O5 ++ O6 = O3
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < case EvN1.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 EE1 O3 O4 V1 O5
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC1 : evalExpr FE EE1 (not (null (name L))) falseVal G1 O4 *
EvC2 : O3 ++ O4 = O1
EvN : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 EE1 O5 *
EvN2 : V1 = intVal 0 -> false
EvN3 : O5 ++ [] = O3
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < case EvN.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (not (null (name L))) falseVal G1 O4 *
EvC2 : O3 ++ O4 = O1
EvN2 : V1 = intVal 0 -> false
EvN3 : [] ++ [] = O3
H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < EvL: case EvC1.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 V1
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : O3 ++ O4 = O1
EvN2 : V1 = intVal 0 -> false
EvN3 : [] ++ [] = O3
H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal G1 O4 *
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < EvL: case EvL (keep).

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2 O3 O4 V1 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : O3 ++ O4 = O1
EvN2 : V1 = intVal 0 -> false
EvN3 : [] ++ [] = O3
H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal G1 O4 *
EvL1 : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name L) (recVal Fields) G1 O4 *
EvL2 : lookup Fields "null" trueVal
============================
 VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < case EvL1.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 O3 V1 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : O3 ++ [] = O1
EvN2 : V1 = intVal 0 -> false
EvN3 : [] ++ [] = O3
H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] *
EvL2 : lookup Fields "null" trueVal
H2 : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields)
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < case IsG+.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 O3 V1 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : O3 ++ [] = O1
EvN2 : V1 = intVal 0 -> false
EvN3 : [] ++ [] = O3
H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] *
EvL2 : lookup Fields "null" trueVal
H2 : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields)
H3 : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, VI), (SaveE, V)]
H4 : is_list (is_list (is_pair is_string is_value)) G
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < apply lookupScopes_is to _ LS.

Subgoal 2.1.2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 O3 V1 Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvC2 : O3 ++ [] = O1
EvN2 : V1 = intVal 0 -> false
EvN3 : [] ++ [] = O3
H1 : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) V1
EvL : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (null (name L)) trueVal ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) [] *
EvL2 : lookup Fields "null" trueVal
H2 : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (recVal Fields)
H3 : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, VI), (SaveE, V)]
H4 : is_list (is_list (is_pair is_string is_value)) G
H5 : is_value OldL
H6 : is_string L
============================
 VI = intVal 0 /\
 [(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
 < apply evalExpr_unique to _ _ _ EvNL EvL.

Subgoal 2:

Variables: OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE G1 (null (name L)) falseVal G1 []
EvA : evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) falseVal G1 O1 *
Eq : VI = intVal 0 /\ G1 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G
============================
 exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
 < case Eq.

Subgoal 2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
EvW : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) O1 *
============================
 exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
 < clear EvW.

Subgoal 2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA : evalStmt FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recUpdate L ["head"] (name SaveE)) G2 O2
============================
 exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
 < EvA: case EvA.

Subgoal 2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 O2 V1 EE1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (name SaveE) V1 EE1 O2
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) EE1 G2
============================
 exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
 < LL: case EvA.

Subgoal 2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) V1
============================
 exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
 < Eq: assert V1 = V.

Subgoal 2.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) V1
============================
 V1 = V
 < LL: case LL.

Subgoal 2.2.1:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL : lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveE V1
============================
 V1 = V
 < L: case LL.

Subgoal 2.2.1.1:

Variables: OldL SaveI SaveE Copy L V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : SaveE = SaveI -> false
NEqHL : SaveE = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : SaveE = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = SaveE -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(SaveE, V1), (SaveI, intVal 0), (SaveE, V)]::G) G2
============================
 V1 = V
 < apply NEqHE to _.

Subgoal 2.2.1.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : Hold = SaveE -> false
L1 : lookup [(SaveI, intVal 0), (SaveE, V)] SaveE V1
============================
 V1 = V
 < L: case L1.

Subgoal 2.2.1.2.1:

Variables: OldL Hold SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveE -> false
NEqHL : Hold = L -> false
NEqIE : SaveE = SaveE -> false
NEqIL : SaveE = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveE = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] (intVal 0) FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveE, intVal 0), (SaveE, V)]::G) G2
L : Hold = SaveE -> false
============================
 intVal 0 = V
 < apply NEqIE to _.

Subgoal 2.2.1.2.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : Hold = SaveE -> false
L1 : SaveI = SaveE -> false
L2 : lookup [(SaveE, V)] SaveE V1
============================
 V1 = V
 < L: case L2.

Subgoal 2.2.1.2.2.1:

Variables: OldL Hold SaveI SaveE Copy L HoldL G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V1)]::G) G2
L : Hold = SaveE -> false
L1 : SaveI = SaveE -> false
============================
 V1 = V1
 < search.

Subgoal 2.2.1.2.2.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : Hold = SaveE -> false
L1 : SaveI = SaveE -> false
L2 : SaveE = SaveE -> false
L3 : lookup [] SaveE V1
============================
 V1 = V
 < case L3.

Subgoal 2.2.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveE
LL1 : lookupScopes SaveE G V1
============================
 V1 = V
 < N: case LL.

Subgoal 2.2.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL1 : lookupScopes SaveE G V1
N : Hold = SaveE -> false
N1 : no_lookup [(SaveI, intVal 0), (SaveE, V)] SaveE
============================
 V1 = V
 < N: case N1.

Subgoal 2.2.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL1 : lookupScopes SaveE G V1
N : Hold = SaveE -> false
N1 : SaveI = SaveE -> false
N2 : no_lookup [(SaveE, V)] SaveE
============================
 V1 = V
 < N: case N2.

Subgoal 2.2.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL1 : lookupScopes SaveE G V1
N : Hold = SaveE -> false
N1 : SaveI = SaveE -> false
N2 : SaveE = SaveE -> false
N3 : no_lookup [] SaveE
============================
 V1 = V
 < apply N2 to _.

Subgoal 2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 V1 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V1 FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) V1
Eq : V1 = V
============================
 exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
 < case Eq.

Subgoal 2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
LL : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) V
============================
 exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
 < clear LL.

Subgoal 2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
============================
 exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
 < Eq: assert OldL = recVal FieldVals.

Subgoal 2.3:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
============================
 OldL = recVal FieldVals
 < L: case EvA1.

Subgoal 2.3.1:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L (recVal FieldVals)
============================
 OldL = recVal FieldVals
 < L: case L.

Subgoal 2.3.1.1:

Variables: OldL SaveI SaveE Copy L V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : L = SaveI -> false
NEqHL : L = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : L = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = L -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(L, recVal FieldVals), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(L, recVal FieldVals), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(L, recVal FieldVals), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(L, recVal FieldVals), (SaveI, intVal 0), (SaveE, V)]::G) G2
============================
 OldL = recVal FieldVals
 < apply NEqHL to _.

Subgoal 2.3.1.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : Hold = L -> false
L1 : lookup [(SaveI, intVal 0), (SaveE, V)] L (recVal FieldVals)
============================
 OldL = recVal FieldVals
 < L: case L1.

Subgoal 2.3.1.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : lookup [(SaveE, V)] L (recVal FieldVals)
============================
 OldL = recVal FieldVals
 < L: case L2.

Subgoal 2.3.1.2.1:

Variables: OldL Hold SaveI Copy L HoldL G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
NEqEL : L = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : L = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal FieldVals)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal FieldVals)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal FieldVals)]::G) []
EvA2 : updateRecFields ["head"] (recVal FieldVals) FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal FieldVals)]::G) G2
L : Hold = L -> false
L1 : SaveI = L -> false
============================
 OldL = recVal FieldVals
 < apply NEqEL to _.

Subgoal 2.3.1.2.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : SaveE = L -> false
L3 : lookup [] L (recVal FieldVals)
============================
 OldL = recVal FieldVals
 < case L3.

Subgoal 2.3.2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L
L1 : lookupScopes L G (recVal FieldVals)
============================
 OldL = recVal FieldVals
 < apply lookupScopes_unique to LS L1.

Subgoal 2.3.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
L : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L
L1 : lookupScopes L G (recVal FieldVals)
============================
 recVal FieldVals = recVal FieldVals
 < search.

Subgoal 2:

Variables: OldL Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G OldL
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
Eq : OldL = recVal FieldVals
============================
 exists I NewL, intVal 0 = intVal I /\ updateListIndex OldL I V NewL
 < case Eq.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA1 : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < clear EvA1.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsG+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Is: case IsG+.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < apply lookupScopes_is to _ LS.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < apply lookupScopes_replaceScopes_exists to _ _ LS with
     V' = recVal NewVals.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < Eq: assert G2 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R.

Subgoal 2.4:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
============================
 G2 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < RS: case EvA3.

Subgoal 2.4.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R I LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
RS : mem (L, I) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain
============================
 ((L, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < M: case RS.

Subgoal 2.4.1.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE O1 FieldVals NewVals R LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes Hold G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name Hold)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string Hold
H3 : replaceScopes Hold (recVal NewVals) G R
RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] Hold LRemain
============================
 ((Hold, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < apply NEqHL to _.

Subgoal 2.4.1.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R I LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveI, intVal 0), (SaveE, V)]
============================
 ((L, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < M: case M.

Subgoal 2.4.1.2.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE O1 FieldVals NewVals R LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveI -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveI -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveI -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes SaveI G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name SaveI)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string SaveI
H3 : replaceScopes SaveI (recVal NewVals) G R
RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain
============================
 ((SaveI, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < apply NEqIL to _.

Subgoal 2.4.1.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R I LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveE, V)]
============================
 ((L, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < M: case M.

Subgoal 2.4.1.2.2.1:

Variables: Hold SaveI SaveE Copy HoldL V G FE O1 FieldVals NewVals R LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveE -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveE -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveE -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveE -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes SaveE G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name SaveE)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string SaveE
H3 : replaceScopes SaveE (recVal NewVals) G R
RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain
============================
 ((SaveE, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < apply NEqEL to _.

Subgoal 2.4.1.2.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R I LRemain
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
RS1 : remove_all [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) []
============================
 ((L, recVal NewVals)::LRemain)::G = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < case M.

Subgoal 2.4.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R New
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
RS : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L
RS1 : replaceScopes L (recVal NewVals) G New
============================
 [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::New = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < apply replaceScopes_unique to RS1 _.

Subgoal 2.4.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
RS : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L
RS1 : replaceScopes L (recVal NewVals) G R
============================
 [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
 < search.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 G2 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) G2
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
Eq : G2 = [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < case Eq.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < assert replaceRecVal "head" V FieldVals NewVals.

Subgoal 2.5:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
============================
 replaceRecVal "head" V FieldVals NewVals
 < RRV: case EvA2.

Subgoal 2.5.1:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
RRV : replaceRecVal "head" V FieldVals NewVals
============================
 replaceRecVal "head" V FieldVals NewVals
 < search.

Subgoal 2.5.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields Updated
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
RRV : lookup FieldVals "head" (recVal Fields)
RRV1 : updateRecFields [] V Fields Updated
RRV2 : replaceRecVal "head" (recVal Updated) FieldVals NewVals
============================
 replaceRecVal "head" V FieldVals NewVals
 < case RRV1.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (null (name L)) falseVal ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < EvNL: case EvNL.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL : evalExpr FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (name L) (recVal Fields) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvNL1 : lookup Fields "null" falseVal
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < EvNL: case EvNL.

Subgoal 2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL1 : lookup Fields "null" falseVal
EvNL : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (recVal Fields)
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < L: case EvNL.

Subgoal 2.6:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL1 : lookup Fields "null" falseVal
L : lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L (recVal Fields)
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < L: case L.

Subgoal 2.6.1:

Variables: SaveI SaveE Copy L V G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : L = SaveI -> false
NEqHL : L = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : L = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = L -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::G) ([(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(L, recVal Fields), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL1 : lookup Fields "null" falseVal
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < apply NEqHL to _.

Subgoal 2.6.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL1 : lookup Fields "null" falseVal
L : Hold = L -> false
L1 : lookup [(SaveI, intVal 0), (SaveE, V)] L (recVal Fields)
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < L: case L1.

Subgoal 2.6.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL1 : lookup Fields "null" falseVal
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : lookup [(SaveE, V)] L (recVal Fields)
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < L: case L2.

Subgoal 2.6.2.1:

Variables: Hold SaveI Copy L HoldL G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
NEqEL : L = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : L = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] (recVal Fields) FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal Fields)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (L, recVal Fields)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (L, recVal Fields)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" (recVal Fields) FieldVals NewVals
EvNL1 : lookup Fields "null" falseVal
L : Hold = L -> false
L1 : SaveI = L -> false
============================
 exists I NewL,
   intVal 0 = intVal I /\
   updateListIndex (recVal FieldVals) I (recVal Fields) NewL
 < apply NEqEL to _.

Subgoal 2.6.2.2:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL1 : lookup Fields "null" falseVal
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : SaveE = L -> false
L3 : lookup [] L (recVal Fields)
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < case L3.

Subgoal 2.7:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R Fields
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL1 : lookup Fields "null" falseVal
L : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L
L1 : lookupScopes L G (recVal Fields)
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < apply lookupScopes_unique to L1 LS.

Subgoal 2.7:

Variables: Hold SaveI SaveE Copy L HoldL V G FE O1 FieldVals NewVals R
IH : forall OldL VI Hold SaveI SaveE Copy L HoldL V G FE G1 O1 G2 O2,
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       (Copy = Hold -> false) -> (Copy = L -> false) -> (SaveI = Copy -> false) ->
       (SaveE = Copy -> false) -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ->
       is_string Copy -> lookupScopes L G OldL -> evalStmt FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) G1 O1 * ->
       evalExpr FE G1 (null (name L)) falseVal G1 [] -> evalStmt FE G1 (recUpdate L ["head"] (name SaveE)) G2 O2 ->
       exists I NewL, VI = intVal I /\ updateListIndex OldL I V NewL
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsCopy : is_string Copy
LS : lookupScopes L G (recVal FieldVals)
EvA2 : updateRecFields ["head"] V FieldVals NewVals
EvA3 : replaceScopes L (recVal NewVals) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::R)
Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
H1 : is_value (recVal FieldVals)
H2 : is_string L
H3 : replaceScopes L (recVal NewVals) G R
H4 : replaceRecVal "head" V FieldVals NewVals
EvNL1 : lookup FieldVals "null" falseVal
L : no_lookup [(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)] L
L1 : lookupScopes L G (recVal FieldVals)
============================
 exists I NewL,
   intVal 0 = intVal I /\ updateListIndex (recVal FieldVals) I V NewL
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalExpr_forward.

Subgoal 1:

Variables: Names FE EE V EE' O Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (nil Ty) V EE' O
============================
 exists EE'',
   evalExpr FE EE (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) V EE'' O /\
   scopes_same EE' EE''
 < case Ev.

Subgoal 1:

Variables: Names FE EE' Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE' Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'',
   evalExpr FE EE' (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) (recVal [("null", trueVal)]) EE'' [] /\
   scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE.

Subgoal 1:

Variables: Names FE EE' Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE' Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
H1 : scopes_same EE' EE'
============================
 exists EE'',
   evalExpr FE EE' (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) (recVal [("null", trueVal)]) EE'' [] /\
   scopes_same EE' EE''
 < search.

Subgoal 2:

Variables: Names FE EE V EE' O E2 E1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) V EE' O
============================
 exists EE'',
   evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V EE'' O /\
   scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'',
   evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\
   scopes_same EE' EE''
 < case IsE.

Subgoal 2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 exists EE'',
   evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 exists EE'',
   evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\
   scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'',
   evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\
   scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 exists EE'',
   evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE'' O /\
   scopes_same EE' EE''
 < exists EE'.

Subgoal 2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O /\
 scopes_same EE' EE'
 < split.

Subgoal 2.1:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < unfold .

Subgoal 2.1:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalRecFields FE EE (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) [("null", falseVal), ("head", V1), ("tail", V2)] EE' O
 < unfold .

Subgoal 2.1:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 exists EE1 O1 O2,
   evalExpr FE EE false falseVal EE1 O1 /\
   (evalRecFields FE EE1 (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) [("head", V1), ("tail", V2)] EE' O2 /\
   O1 ++ O2 = O)
 < exists EE,
   [],
   O.

Subgoal 2.1:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalExpr FE EE false falseVal EE [] /\
 (evalRecFields FE EE (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) [("head", V1), ("tail", V2)] EE' O /\
 [] ++ O = O)
 < split.

Subgoal 2.1.1:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalExpr FE EE false falseVal EE []
 < search.

Subgoal 2.1.2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalRecFields FE EE (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) [("head", V1), ("tail", V2)] EE' O
 < unfold .

Subgoal 2.1.2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 exists EE1 O1 O2,
   evalExpr FE EE E1 V1 EE1 O1 /\
   (evalRecFields FE EE1 (consRecFieldExprs "tail" E2 nilRecFieldExprs) [("tail", V2)] EE' O2 /\
   O1 ++ O2 = O)
 < exists EE3,
   O2,
   O3.

Subgoal 2.1.2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalExpr FE EE E1 V1 EE3 O2 /\
 (evalRecFields FE EE3 (consRecFieldExprs "tail" E2 nilRecFieldExprs) [("tail", V2)] EE' O3 /\
 O2 ++ O3 = O)
 < split.

Subgoal 2.1.2.1:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalExpr FE EE E1 V1 EE3 O2
 < search.

Subgoal 2.1.2.2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalRecFields FE EE3 (consRecFieldExprs "tail" E2 nilRecFieldExprs) [("tail", V2)] EE' O3
 < unfold .

Subgoal 2.1.2.2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 exists EE1 O1 O2,
   evalExpr FE EE3 E2 V2 EE1 O1 /\
   (evalRecFields FE EE1 nilRecFieldExprs [] EE' O2 /\ O1 ++ O2 = O3)
 < exists EE',
   O3,
   [].

Subgoal 2.1.2.2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalExpr FE EE3 E2 V2 EE' O3 /\
 (evalRecFields FE EE' nilRecFieldExprs [] EE' [] /\ O3 ++ [] = O3)
 < split.

Subgoal 2.1.2.2.1:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalExpr FE EE3 E2 V2 EE' O3
 < search.

Subgoal 2.1.2.2.2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 evalRecFields FE EE' nilRecFieldExprs [] EE' []
 < search.

Subgoal 2.1.2.2.3:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 O3 ++ [] = O3
 < IsO3: apply evalExpr_isOutput to _ _ _ Ev1.

Subgoal 2.1.2.2.3:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
IsO3 : is_list is_value O3
============================
 O3 ++ [] = O3
 < apply is_list_values_append_nil to IsO3.

Subgoal 2.1.2.2.3:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
IsO3 : is_list is_value O3
H5 : O3 ++ [] = O3
============================
 O3 ++ [] = O3
 < search.

Subgoal 2.1.2.3:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 O2 ++ O3 = O
 < search.

Subgoal 2.1.3:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 [] ++ O = O
 < search.

Subgoal 2.2:

Variables: Names FE EE EE' O E2 E1 EE3 O2 O3 V2 V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE3 E2 V2 EE' O3
Ev2 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 scopes_same EE' EE'
 < search.

Subgoal 3:

Variables: Names FE EE V EE' O E1
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 3:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "null" V
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
 < case IsE.

Subgoal 3:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "null" V
H1 : is_expr E1
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 3:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "null" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 3:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "null" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H2 : scopes_same EE' EE'
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "null") V EE'' O /\ scopes_same EE' EE''
 < search.

Subgoal 4:

Variables: Names FE EE V EE' O E1
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 4:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "head" V
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
 < case IsE.

Subgoal 4:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "head" V
H1 : is_expr E1
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 4:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "head" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 4:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "head" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H2 : scopes_same EE' EE'
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "head") V EE'' O /\ scopes_same EE' EE''
 < search.

Subgoal 5:

Variables: Names FE EE V EE' O E1
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 5:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "tail" V
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
 < case IsE.

Subgoal 5:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "tail" V
H1 : is_expr E1
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 5:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "tail" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 5:

Variables: Names FE EE V EE' O E1 Fields
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "tail" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H2 : scopes_same EE' EE'
============================
 exists EE'',
   evalExpr FE EE (recFieldAccess E1 "tail") V EE'' O /\ scopes_same EE' EE''
 < search.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsE : is_expr (index Lst Index)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index Lst Index) V EE' O
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < case IsE.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index Lst Index) V EE' O
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < IsIdx+: apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsIdx+ : is_value (intVal Idx)
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < case IsIdx+.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Len: apply length_exists_list_pair_string_value to IsEE.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE N
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < rename N to LengthEE.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < NNS_L: assert newNameScopes [[]] LengthEE ([]::EE) EE.

Subgoal 6.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 newNameScopes [[]] LengthEE ([]::EE) EE
 < unfold .

Subgoal 6.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 exists N SNames BNames,
   ((((length EE LengthEE /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   Names.

Subgoal 6.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 ((((length EE LengthEE /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE Names) /\
 (forall X, mem X [] -> mem X Names -> false)
 < split.

Subgoal 6.1.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 length EE LengthEE
 < search.

Subgoal 6.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 6.1.3:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 6.1.4:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 names [[]] []
 < search.

Subgoal 6.1.5:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 names EE Names
 < search.

Subgoal 6.1.6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 forall X, mem X [] -> mem X Names -> false
 < intros M.

Subgoal 6.1.6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
M : mem X []
H5 : mem X Names
============================
 false
 < case M.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Ev_L: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS_L.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < NNS_L': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_L Ev NNS_L.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2
NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < LenEE3: apply evalExpr_keep_scopes to _ _ _ Ev Len.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2
NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3
LenEE3 : length EE3 LengthEE
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Eq: assert EE_A' = []::EE3.

Subgoal 6.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2
NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3
LenEE3 : length EE3 LengthEE
============================
 EE_A' = []::EE3
 < NNS': case NNS_L'.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A' N SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'1 : drop N EE_A' EE3
NNS'2 : take N EE_A' [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A' = []::EE3
 < Take: case NNS'2.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N2 L
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::L) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'1 : drop N ([]::L) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N
Take1 : take N2 L []
============================
 []::L = []::EE3
 < case Take1.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::L) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'1 : drop N ([]::L) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N
============================
 []::L = []::EE3
 < compute Take.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames L
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::L) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'1 : drop 1 ([]::L) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::L = []::EE3
 < Drop: case NNS'1.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames L N1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::L) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N1 = 1
Drop1 : drop N1 L EE3
============================
 []::L = []::EE3
 < Drop': case Drop1.

Subgoal 6.2.1.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 []::EE3 = []::EE3
 < search.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N1 = 1
Drop' : 1 + N3 = N1
Drop'1 : drop N3 L1 EE3
============================
 []::(X::L1) = []::EE3
 < G: apply drop_geq_0 to Drop'1.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N1 = 1
Drop' : 1 + N3 = N1
Drop'1 : drop N3 L1 EE3
G : N3 >= 0
============================
 []::(X::L1) = []::EE3
 < P: assert 1 + -1 = 0.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N1 = 1
Drop' : 1 + N3 = N1
Drop'1 : drop N3 L1 EE3
G : N3 >= 0
P : 1 + -1 = 0
============================
 []::(X::L1) = []::EE3
 < apply drop_is_integer to Drop'1.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N1 = 1
Drop' : 1 + N3 = N1
Drop'1 : drop N3 L1 EE3
G : N3 >= 0
P : 1 + -1 = 0
H5 : is_integer N3
============================
 []::(X::L1) = []::EE3
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N1 N3 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N1 = 1
Drop' : 1 + N3 = N1
Drop'1 : drop N3 L1 EE3
G : N3 >= 0
P : 1 + -1 = 0
H5 : is_integer N3
H6 : is_integer N1
============================
 []::(X::L1) = []::EE3
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames N3 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N3 = 0
Drop'1 : drop N3 L1 EE3
G : N3 >= 0
P : 1 + -1 = 0
H5 : is_integer N3
H6 : is_integer 0
============================
 []::(X::L1) = []::EE3
 < apply plus_integer_unique_addend to _ _ _ Drop' P.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE3
G : -1 >= 0
P : 1 + -1 = 0
H5 : is_integer -1
H6 : is_integer 0
============================
 []::(X::L1) = []::EE3
 < L: case G.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE SNames BNames L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::(X::L1)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE3
P : 1 + -1 = 0
H5 : is_integer -1
H6 : is_integer 0
L : 0 <= -1
============================
 []::(X::L1) = []::EE3
 < case L.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2
LenEE3 : length (S::BR) LengthEE
NNS' : newNameScopes [[]] LengthEE AR BR
============================
 S::AR = []::(S::BR)
 < LenBR: case LenEE3.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2
NNS' : newNameScopes [[]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
============================
 S::AR = []::(S::BR)
 < apply length_is to LenBR.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2
NNS' : newNameScopes [[]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H5 : is_integer N'
============================
 S::AR = []::(S::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2
NNS' : newNameScopes [[]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H5 : is_integer N'
LEq : LengthEE <= N'
============================
 S::AR = []::(S::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV O2 Idx O3 LengthEE BR S AR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV (S::AR) O2
NNS' : newNameScopes [[]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H5 : is_integer N'
LEq : LengthEE <= N'
L : N' < LengthEE
============================
 S::AR = []::(S::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE EE_A'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV EE_A' O2
NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3
LenEE3 : length EE3 LengthEE
Eq : EE_A' = []::EE3
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < case Eq.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Ev_DL: assert evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < IsEE3: apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < apply fresh_name_is to _ Pr1.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < apply fresh_name_is to _ Pr2.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < NamesEE3: apply names_exists to IsEE3.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < NNS_I: assert newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3.

Subgoal 6.3:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
 < unfold .

Subgoal 6.3:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 exists N SNames BNames,
   ((((length EE3 LengthEE /\ drop N ([(SaveL, LV)]::EE3) EE3) /\
   take N ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\
   names [[(SaveL, LV)]] SNames) /\
   names EE3 BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveL],
   N.

Subgoal 6.3:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 ((((length EE3 LengthEE /\ drop 1 ([(SaveL, LV)]::EE3) EE3) /\
 take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\
 names [[(SaveL, LV)]] [SaveL]) /\
 names EE3 N) /\
 (forall X, mem X [SaveL] -> mem X N -> false)
 < split.

Subgoal 6.3.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 length EE3 LengthEE
 < search.

Subgoal 6.3.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 drop 1 ([(SaveL, LV)]::EE3) EE3
 < search.

Subgoal 6.3.3:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]
 < search.

Subgoal 6.3.4:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 names [[(SaveL, LV)]] [SaveL]
 < search.

Subgoal 6.3.5:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 names EE3 N
 < search.

Subgoal 6.3.6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
============================
 forall X, mem X [SaveL] -> mem X N -> false
 < intros ML MN.

Subgoal 6.3.6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
ML : mem X [SaveL]
MN : mem X N
============================
 false
 < ML: case ML.

Subgoal 6.3.6.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
MN : mem SaveL N
============================
 false
 < NS: apply evalExpr_names_same to _ _ _ Ev.

Subgoal 6.3.6.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
MN : mem SaveL N
NS : names_same EE EE3
============================
 false
 < NS': apply names_same_symmetric to NS.

Subgoal 6.3.6.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
MN : mem SaveL N
NS : names_same EE EE3
NS' : names_same EE3 EE
============================
 false
 < MNames: apply names_same_names to _ NamesEE3 Names MN.

Subgoal 6.3.6.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
MN : mem SaveL N
NS : names_same EE EE3
NS' : names_same EE3 EE
MNames : mem SaveL Names
============================
 false
 < apply fresh_name_not_mem to Pr2 MNames.

Subgoal 6.3.6.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
MN : mem X N
ML : mem X []
============================
 false
 < case ML.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Ev_I: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev1 NNS_I.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < NNS_If: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_I Ev1 NNS_I.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE'
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < LenEE': apply evalExpr_keep_scopes to _ _ _ Ev1 LenEE3.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE'
LenEE' : length EE' LengthEE
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Eq: assert EE_A'1 = [(SaveL, LV)]::EE'.

Subgoal 6.4:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE'
LenEE' : length EE' LengthEE
============================
 EE_A'1 = [(SaveL, LV)]::EE'
 < NNS': case NNS_If.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1 N1 SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'1 : drop N1 EE_A'1 EE'
NNS'2 : take N1 EE_A'1 [[(SaveL, LV)]]
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A'1 = [(SaveL, LV)]::EE'
 < Take: case NNS'2.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N N1 SNames BNames N2 L
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::L) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'1 : drop N1 ([(SaveL, LV)]::L) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 L []
============================
 [(SaveL, LV)]::L = [(SaveL, LV)]::EE'
 < case Take1.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N N1 SNames BNames L
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::L) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'1 : drop N1 ([(SaveL, LV)]::L) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 [(SaveL, LV)]::L = [(SaveL, LV)]::EE'
 < compute Take.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::L) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'1 : drop 1 ([(SaveL, LV)]::L) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveL, LV)]::L = [(SaveL, LV)]::EE'
 < Drop: case NNS'1.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::L) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 L EE'
============================
 [(SaveL, LV)]::L = [(SaveL, LV)]::EE'
 < Drop': case Drop1.

Subgoal 6.4.1.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 [(SaveL, LV)]::EE' = [(SaveL, LV)]::EE'
 < search.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
============================
 [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
 < G: apply drop_geq_0 to Drop'1.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
============================
 [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
 < P: assert 1 + -1 = 0.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
P : 1 + -1 = 0
============================
 [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
 < apply drop_is_integer to Drop'1.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
P : 1 + -1 = 0
H8 : is_integer N4
============================
 [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
P : 1 + -1 = 0
H8 : is_integer N4
H9 : is_integer N3
============================
 [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames N4 L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N4 = 0
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
P : 1 + -1 = 0
H8 : is_integer N4
H9 : is_integer 0
============================
 [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
 < apply plus_integer_unique_addend to _ _ _ Drop' P.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE'
G : -1 >= 0
P : 1 + -1 = 0
H8 : is_integer -1
H9 : is_integer 0
============================
 [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
 < L: case G.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N SNames BNames L1 X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::(X::L1)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE'
P : 1 + -1 = 0
H8 : is_integer -1
H9 : is_integer 0
L : 0 <= -1
============================
 [(SaveL, LV)]::(X::L1) = [(SaveL, LV)]::EE'
 < case L.

Subgoal 6.4.2:

Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3
LenEE' : length (S::BR) LengthEE
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < LenBR: case LenEE'.

Subgoal 6.4.2:

Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < apply length_is to LenBR.

Subgoal 6.4.2:

Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H8 : is_integer N'
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 6.4.2:

Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H8 : is_integer N'
LEq : LengthEE <= N'
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 6.4.2:

Variables: Names FE EE V O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N BR S AR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) (S::BR) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) (S::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H8 : is_integer N'
LEq : LengthEE <= N'
L : N' < LengthEE
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N EE_A'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) EE_A'1 O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE'
LenEE' : length EE' LengthEE
Eq : EE_A'1 = [(SaveL, LV)]::EE'
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < case Eq.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Ev_DI: assert evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < GEq: apply listIndex_geq_0 to _ Ev2.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
GEq : Idx >= 0
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < case GEq.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Ev_C: assert evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [].

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < EvIf: assert evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [].

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < NEq: assert SaveL = SaveI -> false.

Subgoal 6.5:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
============================
 SaveL = SaveI -> false
 < intros E.

Subgoal 6.5:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
E : SaveL = SaveI
============================
 false
 < case E.

Subgoal 6.5:

Variables: Names FE EE V EE' O SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveI
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveI Lst) ([(SaveI, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveI
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) Index (intVal Idx) ([(SaveI, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveI, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') []
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 6.5:

Variables: Names FE EE V EE' O SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N S
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveI
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveI Lst) ([(SaveI, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveI
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) Index (intVal Idx) ([(SaveI, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveI, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') []
AppI : "I" ++ S = SaveI
============================
 false
 < AppL: apply fresh_name_start to _ Pr2.

Subgoal 6.5:

Variables: Names FE EE V EE' O SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N S S1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveI
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveI Lst) ([(SaveI, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveI
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) Index (intVal Idx) ([(SaveI, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveI, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') []
AppI : "I" ++ S = SaveI
AppL : "L" ++ S1 = SaveI
============================
 false
 < case AppI.

Subgoal 6.5:

Variables: Names FE EE V EE' O Index Lst LV EE3 O2 Idx O3 LengthEE N S S1 L3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy ("I"::L3) Lst) (seq (declare intTy ("I"::L3) Index) (seq (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (recFieldAccess (name ("I"::L3)) "tail")) (assign ("I"::L3) (minus (name ("I"::L3)) (num 1)))))))) (recFieldAccess (name ("I"::L3)) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names ("I"::L3)
Pr2 : fresh_name "L" Names ("I"::L3)
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy ("I"::L3) Lst) ([("I"::L3, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string ("I"::L3)
H7 : is_string ("I"::L3)
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[("I"::L3, LV)]] LengthEE ([("I"::L3, LV)]::EE3) EE3
Ev_I : evalExpr FE ([("I"::L3, LV)]::EE3) Index (intVal Idx) ([("I"::L3, LV)]::EE') O3
NNS_If : newNameScopes [[("I"::L3, LV)]] LengthEE ([("I"::L3, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([("I"::L3, LV)]::EE3) (declare intTy ("I"::L3) Index) ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') (greater (num 0) (name ("I"::L3))) falseVal ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') []
EvIf : evalStmt FE ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') []
AppL : "L" ++ S1 = "I"::L3
H9 : [] ++ S = L3
============================
 false
 < case AppL.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < EvWhile: apply index_to_while to Ev2 NEq _ with
              Ctx = EE' FE = FE.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < Ev_W: apply drop_ext_size_evalStmt to EvWhile.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < assert SaveI = SaveL -> false.

Subgoal 6.6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 SaveI = SaveL -> false
 < intros E.

Subgoal 6.6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
E : SaveI = SaveL
============================
 false
 < case E.

Subgoal 6.6:

Variables: Names FE EE V EE' O SaveL Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveL Index) (seq (ifThenElse (greater (num 0) (name SaveL)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveL
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveL Index) ([(SaveL, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveL)) falseVal ([(SaveL, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveL)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveL, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveL -> false
EvWhile : <evalStmt {ES}> FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1))))) ([(SaveL, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1))))) ([(SaveL, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 false
 < backchain NEq.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < assert lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields).

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < assert evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [].

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE'' O /\
   scopes_same EE' EE''
 < exists EE'.

Subgoal 6:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O /\
 scopes_same EE' EE'
 < split.

Subgoal 6.7:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
 < IsO2: apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 6.7:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
 < IsO3: apply evalExpr_isOutput to _ _ _ Ev1.

Subgoal 6.7:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
 < IsO: apply append_values_is to _ _ Ev3.

Subgoal 6.7:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
 < apply is_list_values_append_nil to IsO3.

Subgoal 6.7:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H12 : O3 ++ [] = O3
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
 < unfold .

Subgoal 6.7:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H12 : O3 ++ [] = O3
============================
 exists EE1 O1 Scope O2,
   evalStmt FE ([]::EE) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) EE1 O1 /\
   (evalExpr FE EE1 (recFieldAccess (name SaveL) "head") V (Scope::EE') O2 /\
   O1 ++ O2 = O)
 < exists [(SaveI, intVal 0), (SaveL, recVal Fields)]::EE',
   O,
   [(SaveI, intVal 0), (SaveL, recVal Fields)],
   [].

Subgoal 6.7:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H12 : O3 ++ [] = O3
============================
 evalStmt FE ([]::EE) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') O /\
 (evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] /\
 O ++ [] = O)
 < split.

Subgoal 6.7.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H12 : O3 ++ [] = O3
============================
 evalStmt FE ([]::EE) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') O
 < search.

Subgoal 6.7.2:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H12 : O3 ++ [] = O3
============================
 evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
 < search.

Subgoal 6.7.3:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H12 : O3 ++ [] = O3
============================
 O ++ [] = O
 < backchain is_list_values_append_nil.

Subgoal 6.8:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 scopes_same EE' EE'
 < apply evalStmt_isCtx to _ _ _ Ev_DL.

Subgoal 6.8:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3)
============================
 scopes_same EE' EE'
 < apply evalStmt_isCtx to _ _ _ Ev_DI.

Subgoal 6.8:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3)
H13 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal Idx), (SaveL, LV)]::EE')
============================
 scopes_same EE' EE'
 < IsEE'+: apply evalStmt_isCtx to _ _ _ Ev_W.

Subgoal 6.8.1:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3)
H13 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal Idx), (SaveL, LV)]::EE')
============================
 is_stmt (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))
 < search 20.

Subgoal 6.8:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3)
H13 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal Idx), (SaveL, LV)]::EE')
IsEE'+ : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE')
============================
 scopes_same EE' EE'
 < case IsEE'+.

Subgoal 6.8:

Variables: Names FE EE V EE' O SaveL SaveI Index Lst LV EE3 O2 Idx O3 LengthEE N Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV EE3 O2
Ev1 : evalExpr FE EE3 Index (intVal Idx) EE' O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) Lst LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL Lst) ([(SaveL, LV)]::EE3) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveL
NamesEE3 : names EE3 N
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) Index (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : evalStmt FE ([(SaveL, LV)]::EE3) (declare intTy SaveI Index) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H8 : 0 <= Idx
Ev_C : evalExpr FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
EvIf : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
H11 : evalExpr FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, LV)]::EE3)
H13 : is_list (is_list (is_pair is_string is_value)) ([(SaveI, intVal Idx), (SaveL, LV)]::EE')
H14 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveL, recVal Fields)]
H15 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 scopes_same EE' EE'
 < backchain scopes_same_reflexive.

Subgoal 7:

Variables: Names FE EE V EE' O Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) V EE' O
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE'' O /\
   scopes_same EE' EE''
 < case IsE.

Subgoal 7:

Variables: Names FE EE V EE' O Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) V EE' O
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE'' O /\
   scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < NNS: assert newNameScopes [[]] N ([]::EE) EE.

Subgoal 7.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 newNameScopes [[]] N ([]::EE) EE
 < unfold .

Subgoal 7.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 exists N1 SNames BNames,
   ((((length EE N /\ drop N1 ([]::EE) EE) /\ take N1 ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   Names.

Subgoal 7.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 ((((length EE N /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE Names) /\
 (forall X, mem X [] -> mem X Names -> false)
 < split.

Subgoal 7.1.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 length EE N
 < search.

Subgoal 7.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 7.1.3:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 7.1.4:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 names [[]] []
 < search.

Subgoal 7.1.5:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 names EE Names
 < search.

Subgoal 7.1.6:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
============================
 forall X, mem X [] -> mem X Names -> false
 < intros M.

Subgoal 7.1.6:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
M : mem X []
H2 : mem X Names
============================
 false
 < case M.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < Ev_L: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < NNS_L: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_L Ev NNS.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
NNS_L : newNameScopes [[]] N EE_A' EE'
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < LenEE': apply evalExpr_keep_scopes to _ _ _ Ev LenEE.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
NNS_L : newNameScopes [[]] N EE_A' EE'
LenEE' : length EE' N
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < Eq: assert EE_A' = []::EE'.

Subgoal 7.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
NNS_L : newNameScopes [[]] N EE_A' EE'
LenEE' : length EE' N
============================
 EE_A' = []::EE'
 < NNS': case NNS_L.

Subgoal 7.2.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A' N1 SNames BNames
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
LenEE' : length EE' N
NNS' : length EE' N
NNS'1 : drop N1 EE_A' EE'
NNS'2 : take N1 EE_A' [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A' = []::EE'
 < Take: case NNS'2.

Subgoal 7.2.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N N1 SNames BNames N2 L
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'1 : drop N1 ([]::L) EE'
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 L []
============================
 []::L = []::EE'
 < case Take1.

Subgoal 7.2.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N N1 SNames BNames L
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'1 : drop N1 ([]::L) EE'
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 []::L = []::EE'
 < compute Take.

Subgoal 7.2.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames L
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'1 : drop 1 ([]::L) EE'
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::L = []::EE'
 < Drop: case NNS'1.

Subgoal 7.2.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames L N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 L EE'
============================
 []::L = []::EE'
 < Drop': case Drop1.

Subgoal 7.2.1.1:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 []::EE' = []::EE'
 < search.

Subgoal 7.2.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
============================
 []::(X::L1) = []::EE'
 < G: apply drop_geq_0 to Drop'1.

Subgoal 7.2.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
============================
 []::(X::L1) = []::EE'
 < P: assert 1 + -1 = 0.

Subgoal 7.2.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
P : 1 + -1 = 0
============================
 []::(X::L1) = []::EE'
 < apply drop_is_integer to Drop'1.

Subgoal 7.2.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
P : 1 + -1 = 0
H2 : is_integer N4
============================
 []::(X::L1) = []::EE'
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 7.2.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N3 N4 L1 X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
P : 1 + -1 = 0
H2 : is_integer N4
H3 : is_integer N3
============================
 []::(X::L1) = []::EE'
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 7.2.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames N4 L1 X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N4 = 0
Drop'1 : drop N4 L1 EE'
G : N4 >= 0
P : 1 + -1 = 0
H2 : is_integer N4
H3 : is_integer 0
============================
 []::(X::L1) = []::EE'
 < apply plus_integer_unique_addend to _ _ _ Drop' P.

Subgoal 7.2.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames L1 X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE'
G : -1 >= 0
P : 1 + -1 = 0
H2 : is_integer -1
H3 : is_integer 0
============================
 []::(X::L1) = []::EE'
 < L: case G.

Subgoal 7.2.1.2:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N SNames BNames L1 X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N
NNS' : length EE' N
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE'
P : 1 + -1 = 0
H2 : is_integer -1
H3 : is_integer 0
L : 0 <= -1
============================
 []::(X::L1) = []::EE'
 < case L.

Subgoal 7.2.2:

Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
LenEE' : length (S::BR) N
NNS' : newNameScopes [[]] N AR BR
============================
 S::AR = []::(S::BR)
 < LenBR: case LenEE'.

Subgoal 7.2.2:

Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR N'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
NNS' : newNameScopes [[]] N AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N
============================
 S::AR = []::(S::BR)
 < apply length_is to LenBR.

Subgoal 7.2.2:

Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR N'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
NNS' : newNameScopes [[]] N AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N
H2 : is_integer N'
============================
 S::AR = []::(S::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 7.2.2:

Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR N'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
NNS' : newNameScopes [[]] N AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N
H2 : is_integer N'
LEq : N <= N'
============================
 S::AR = []::(S::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 7.2.2:

Variables: Names FE EE O Len SaveL E1 V1 I N BR S AR N'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
NNS' : newNameScopes [[]] N AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N
H2 : is_integer N'
LEq : N <= N'
L : N' < N
============================
 S::AR = []::(S::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N EE_A'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
NNS_L : newNameScopes [[]] N EE_A' EE'
LenEE' : length EE' N
Eq : EE_A' = []::EE'
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < case Eq.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < Ev_DL: assert evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < Ev_DLen: assert evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [].

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < IsO: apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < apply listLength_is to _ Ev1.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < NEq: assert SaveL = Len -> false.

Subgoal 7.3:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
============================
 SaveL = Len -> false
 < intros E.

Subgoal 7.3:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
E : SaveL = Len
============================
 false
 < case E.

Subgoal 7.3:

Variables: Names FE EE EE' O Len E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names Len
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O
Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
============================
 false
 < AppLen: apply fresh_name_start to _ Pr2.

Subgoal 7.3:

Variables: Names FE EE EE' O Len E1 V1 I N S
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names Len
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O
Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
AppLen : "Len" ++ S = Len
============================
 false
 < FrL: case Pr1.

Subgoal 7.3.1:

Variables: Names FE EE EE' O E1 V1 I N S
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy "L" E1) (seq (declare intTy "L" (num 0)) (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))))) (name "L")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names "L"
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy "L" E1) ([("L", V1)]::EE') O
Ev_DLen : evalStmt FE ([("L", V1)]::EE') (declare intTy "L" (num 0)) ([("L", intVal 0), ("L", V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
AppLen : "Len" ++ S = "L"
FrL : not_mem "L" Names
============================
 false
 < App: case AppLen.

Subgoal 7.3.1:

Variables: Names FE EE EE' O E1 V1 I N S
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy "L" E1) (seq (declare intTy "L" (num 0)) (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))))) (name "L")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names "L"
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy "L" E1) ([("L", V1)]::EE') O
Ev_DLen : evalStmt FE ([("L", V1)]::EE') (declare intTy "L" (num 0)) ([("L", intVal 0), ("L", V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
FrL : not_mem "L" Names
App : "en" ++ S = []
============================
 false
 < case App.

Subgoal 7.3.2:

Variables: Names FE EE EE' O Len E1 V1 I N S NewBase
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O
Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
AppLen : "Len" ++ S = Len
FrL : mem "L" Names
FrL1 : "L" ++ "_" = NewBase
FrL2 : fresh_name NewBase Names Len
============================
 false
 < AppL: case FrL1.

Subgoal 7.3.2:

Variables: Names FE EE EE' O Len E1 V1 I N S L3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O
Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
AppLen : "Len" ++ S = Len
FrL : mem "L" Names
FrL2 : fresh_name ("L"::L3) Names Len
AppL : [] ++ "_" = L3
============================
 false
 < case AppL.

Subgoal 7.3.2:

Variables: Names FE EE EE' O Len E1 V1 I N S
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O
Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
AppLen : "Len" ++ S = Len
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names Len
============================
 false
 < AppL: apply fresh_name_start to _ FrL2.

Subgoal 7.3.2:

Variables: Names FE EE EE' O Len E1 V1 I N S S1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy Len E1) ([(Len, V1)]::EE') O
Ev_DLen : evalStmt FE ([(Len, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (Len, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
AppLen : "Len" ++ S = Len
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names Len
AppL : "L_" ++ S1 = Len
============================
 false
 < AppL: case AppL.

Subgoal 7.3.2:

Variables: Names FE EE EE' O E1 V1 I N S S1 L1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::L1) E1) (seq (declare intTy ("L"::L1) (num 0)) (while (not (recFieldAccess (name ("L"::L1)) "null")) (seq (assign ("L"::L1) (recFieldAccess (name ("L"::L1)) "tail")) (assign ("L"::L1) (plus (name ("L"::L1)) (num 1))))))) (name ("L"::L1))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names ("L"::L1)
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy ("L"::L1) E1) ([("L"::L1, V1)]::EE') O
Ev_DLen : evalStmt FE ([("L"::L1, V1)]::EE') (declare intTy ("L"::L1) (num 0)) ([("L"::L1, intVal 0), ("L"::L1, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
AppLen : "Len" ++ S = "L"::L1
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names ("L"::L1)
AppL : "_" ++ S1 = L1
============================
 false
 < case AppL.

Subgoal 7.3.2:

Variables: Names FE EE EE' O E1 V1 I N S S1 L4
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::("_"::L4)) E1) (seq (declare intTy ("L"::("_"::L4)) (num 0)) (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))))) (name ("L"::("_"::L4)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names ("L"::("_"::L4))
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy ("L"::("_"::L4)) E1) ([("L"::("_"::L4), V1)]::EE') O
Ev_DLen : evalStmt FE ([("L"::("_"::L4), V1)]::EE') (declare intTy ("L"::("_"::L4)) (num 0)) ([("L"::("_"::L4), intVal 0), ("L"::("_"::L4), V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
AppLen : "Len" ++ S = "L"::("_"::L4)
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names ("L"::("_"::L4))
H4 : [] ++ S1 = L4
============================
 false
 < AppLen: case AppLen.

Subgoal 7.3.2:

Variables: Names FE EE EE' O E1 V1 I N S S1 L4
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::("_"::L4)) E1) (seq (declare intTy ("L"::("_"::L4)) (num 0)) (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))))) (name ("L"::("_"::L4)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr2 : fresh_name "Len" Names ("L"::("_"::L4))
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy ("L"::("_"::L4)) E1) ([("L"::("_"::L4), V1)]::EE') O
Ev_DLen : evalStmt FE ([("L"::("_"::L4), V1)]::EE') (declare intTy ("L"::("_"::L4)) (num 0)) ([("L"::("_"::L4), intVal 0), ("L"::("_"::L4), V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names ("L"::("_"::L4))
H4 : [] ++ S1 = L4
AppLen : "en" ++ S = "_"::L4
============================
 false
 < case AppLen.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < P: assert 0 + I = I.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < P': apply plus_integer_comm to _ _ P.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < Ev_W_ES: apply length_to_while to Ev1 NEq P' _ _ with
              FE = FE Ctx = EE'.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < Ev_W: apply drop_ext_size_evalStmt to Ev_W_ES.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < LS: assert lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I).

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < Ev_N: assert evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [].

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 exists EE'',
   evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE'' O /\
   scopes_same EE' EE''
 < exists EE'.

Subgoal 7:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O /\
 scopes_same EE' EE'
 < split.

Subgoal 7.4:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
 < apply is_list_values_append_nil to IsO.

Subgoal 7.4:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H4 : O ++ [] = O
============================
 evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
 < search.

Subgoal 7.5:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 scopes_same EE' EE'
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 7.5:

Variables: Names FE EE EE' O Len SaveL E1 V1 I N Fields
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Ev1 : listLength V1 I
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N ([]::EE') EE'
LenEE' : length EE' N
Ev_DL : evalStmt FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
Ev_DLen : evalStmt FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
IsO : is_list is_value O
H2 : is_value V1
H3 : is_integer I
NEq : SaveL = Len -> false
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : evalExpr FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H4 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 scopes_same EE' EE'
 < backchain scopes_same_reflexive.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalExpr_backward.

Subgoal 1:

Variables: Names FE EE V EE' O Ctx Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (nil Ty) []
Ev : evalExpr FE EE (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) V EE' O
============================
 exists EE'', evalExpr FE EE (nil Ty) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ty VF
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (nil Ty) []
Ev : evalRecFields FE EE (consRecFieldExprs "null" true nilRecFieldExprs) VF EE' O
============================
 exists EE'', evalExpr FE EE (nil Ty) (recVal VF) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ty EE3 O2 O3 VRest V1
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (nil Ty) []
Ev : evalExpr FE EE true V1 EE3 O2
Ev1 : evalRecFields FE EE3 nilRecFieldExprs VRest EE' O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'',
   evalExpr FE EE (nil Ty) (recVal (("null", V1)::VRest)) EE'' O /\
   scopes_same EE' EE''
 < case Ev.

Subgoal 1:

Variables: Names FE EE' O Ctx Ty EE3 O3 VRest
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE3 Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
EN : exprNames Ctx (nil Ty) []
Ev1 : evalRecFields FE EE3 nilRecFieldExprs VRest EE' O3
Ev2 : [] ++ O3 = O
============================
 exists EE'',
   evalExpr FE EE3 (nil Ty) (recVal (("null", trueVal)::VRest)) EE'' O /\
   scopes_same EE' EE''
 < case Ev1.

Subgoal 1:

Variables: Names FE EE' O Ctx Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE' Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE' Ctx
EN : exprNames Ctx (nil Ty) []
Ev2 : [] ++ [] = O
============================
 exists EE'',
   evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE'' O /\
   scopes_same EE' EE''
 < case Ev2.

Subgoal 1:

Variables: Names FE EE' Ctx Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE' Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE' Ctx
EN : exprNames Ctx (nil Ty) []
============================
 exists EE'',
   evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE'' [] /\
   scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE.

Subgoal 1:

Variables: Names FE EE' Ctx Ty
Pr : Names |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
Names : names EE' Names
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE' Ctx
EN : exprNames Ctx (nil Ty) []
H1 : scopes_same EE' EE'
============================
 exists EE'',
   evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE'' [] /\
   scopes_same EE' EE''
 < search.

Subgoal 2:

Variables: Names FE EE V EE' O Ctx E2 E1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev : evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V EE' O
============================
 exists EE'', evalExpr FE EE (cons E1 E2) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx E2 E1 VF
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev : evalRecFields FE EE (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) VF EE' O
============================
 exists EE'',
   evalExpr FE EE (cons E1 E2) (recVal VF) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx E2 E1 EE3 O2 O3 VRest V1
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev : evalExpr FE EE false V1 EE3 O2
Ev1 : evalRecFields FE EE3 (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) VRest EE' O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'',
   evalExpr FE EE (cons E1 E2) (recVal (("null", V1)::VRest)) EE'' O /\
   scopes_same EE' EE''
 < case Ev.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 O3 VRest
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev1 : evalRecFields FE EE3 (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) VRest EE' O3
Ev2 : [] ++ O3 = O
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal (("null", falseVal)::VRest)) EE'' O /\
   scopes_same EE' EE''
 < Ev: case Ev1.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 O3 EE1 O1 O4 VRest1 V2
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev2 : [] ++ O3 = O
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev1 : evalRecFields FE EE1 (consRecFieldExprs "tail" E2 nilRecFieldExprs) VRest1 EE' O4
Ev3 : O1 ++ O4 = O3
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal (("null", falseVal)::(("head", V2)::VRest1))) EE'' O /\
   scopes_same EE' EE''
 < Ev: case Ev1.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 O3 EE1 O1 O4 V2 EE2 O5 O6 VRest2 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev2 : [] ++ O3 = O
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O3
Ev1 : evalExpr FE EE1 E2 V3 EE2 O5
Ev4 : evalRecFields FE EE2 nilRecFieldExprs VRest2 EE' O6
Ev5 : O5 ++ O6 = O4
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal (("null", falseVal)::(("head", V2)::(("tail", V3)::VRest2)))) EE'' O /\
   scopes_same EE' EE''
 < case Ev4.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 O3 EE1 O1 O4 V2 O5 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev2 : [] ++ O3 = O
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O3
Ev1 : evalExpr FE EE1 E2 V3 EE' O5
Ev5 : O5 ++ [] = O4
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < case Ev2.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 O5 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O
Ev1 : evalExpr FE EE1 E2 V3 EE' O5
Ev5 : O5 ++ [] = O4
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < apply append_nil_right to Ev5.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O
Ev1 : evalExpr FE EE1 E2 V3 EE' O4
Ev5 : O4 ++ [] = O4
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < case IsE.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
EN : exprNames Ctx (cons E1 E2) []
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O
Ev1 : evalExpr FE EE1 E2 V3 EE' O4
Ev5 : O4 ++ [] = O4
H1 : is_expr E1
H2 : is_expr E2
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < EN: case EN.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3 N1 N2
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O
Ev1 : evalExpr FE EE1 E2 V3 EE' O4
Ev5 : O4 ++ [] = O4
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 N1
EN1 : exprNames Ctx E2 N2
EN2 : N1 ++ N2 = []
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < case EN2.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O
Ev1 : evalExpr FE EE1 E2 V3 EE' O4
Ev5 : O4 ++ [] = O4
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O
Ev1 : evalExpr FE EE1 E2 V3 EE' O4
Ev5 : O4 ++ [] = O4
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
H3 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O
Ev1 : evalExpr FE EE1 E2 V3 EE' O4
Ev5 : O4 ++ [] = O4
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
H3 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 2:

Variables: Names FE EE' O Ctx E2 E1 EE3 EE1 O1 O4 V2 V3
Pr : Names |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
Names : names EE3 Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE3
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE3 Ctx
Ev : evalExpr FE EE3 E1 V2 EE1 O1
Ev3 : O1 ++ O4 = O
Ev1 : evalExpr FE EE1 E2 V3 EE' O4
Ev5 : O4 ++ [] = O4
H1 : is_expr E1
H2 : is_expr E2
EN : exprNames Ctx E1 []
EN1 : exprNames Ctx E2 []
H3 : is_list (is_list (is_pair is_string is_value)) EE1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H4 : scopes_same EE' EE'
============================
 exists EE'',
   evalExpr FE EE3 (cons E1 E2) (recVal [("null", falseVal), ("head", V2), ("tail", V3)]) EE'' O /\
   scopes_same EE' EE''
 < search.

Subgoal 3:

Variables: Names FE EE V EE' O Ctx E1
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (null E1) []
Ev : evalExpr FE EE (recFieldAccess E1 "null") V EE' O
============================
 exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 3:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (null E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "null" V
============================
 exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
 < case IsE.

Subgoal 3:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (null E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "null" V
H1 : is_expr E1
============================
 exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 3:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (null E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "null" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 3:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- null E1 ~~> recFieldAccess E1 "null"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (null E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "null" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H2 : scopes_same EE' EE'
============================
 exists EE'', evalExpr FE EE (null E1) V EE'' O /\ scopes_same EE' EE''
 < search.

Subgoal 4:

Variables: Names FE EE V EE' O Ctx E1
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (head E1) []
Ev : evalExpr FE EE (recFieldAccess E1 "head") V EE' O
============================
 exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 4:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (head E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "head" V
============================
 exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
 < case IsE.

Subgoal 4:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (head E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "head" V
H1 : is_expr E1
============================
 exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 4:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (head E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "head" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 4:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- head E1 ~~> recFieldAccess E1 "head"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (head E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "head" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H2 : scopes_same EE' EE'
============================
 exists EE'', evalExpr FE EE (head E1) V EE'' O /\ scopes_same EE' EE''
 < search.

Subgoal 5:

Variables: Names FE EE V EE' O Ctx E1
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (tail E1) []
Ev : evalExpr FE EE (recFieldAccess E1 "tail") V EE' O
============================
 exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 5:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (tail E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "tail" V
============================
 exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
 < case IsE.

Subgoal 5:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (tail E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "tail" V
H1 : is_expr E1
============================
 exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 5:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (tail E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "tail" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 5:

Variables: Names FE EE V EE' O Ctx E1 Fields
Pr : Names |{expr}- tail E1 ~~> recFieldAccess E1 "tail"
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (tail E1) []
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
Ev1 : lookup Fields "tail" V
H1 : is_expr E1
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H2 : scopes_same EE' EE'
============================
 exists EE'', evalExpr FE EE (tail E1) V EE'' O /\ scopes_same EE' EE''
 < search.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsE : is_expr (index Lst Index)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (index Lst Index) []
Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < case IsE.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (index Lst Index) []
Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < EN: case EN.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst N1 N2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst N1
EN1 : exprNames Ctx Index N2
EN2 : N1 ++ N2 = []
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < case EN2.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) EE3 O2
Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 EE1 O1 O4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalStmt FE ([]::EE) (declare intTy SaveL Lst) EE1 O1
Ev3 : evalStmt FE EE1 (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))))) EE3 O4
Ev4 : O1 ++ O4 = O2
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev3.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 EE1 O1 O4 EE2 O5 O6
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalStmt FE ([]::EE) (declare intTy SaveL Lst) EE1 O1
Ev4 : O1 ++ O4 = O2
Ev3 : evalStmt FE EE1 (declare intTy SaveI Index) EE2 O5
Ev5 : evalStmt FE EE2 (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) EE3 O6
Ev6 : O5 ++ O6 = O4
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 O1 O4 EE2 O5 O6 EE5 Scope1 V1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev4 : O1 ++ O4 = O2
Ev3 : evalStmt FE (((SaveL, V1)::Scope1)::EE5) (declare intTy SaveI Index) EE2 O5
Ev5 : evalStmt FE EE2 (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) EE3 O6
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev3.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev1 : evalExpr FE EE3 (recFieldAccess (name SaveL) "head") V (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev4 : O1 ++ O4 = O2
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) EE3 O6
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev1.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst EE3 O2 Scope O3 O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ O3 = O
Ev4 : O1 ++ O4 = O2
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) EE3 O6
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev1 : evalExpr FE EE3 (name SaveL) (recVal Fields) (Scope::EE') O3
Ev7 : lookup Fields "head" V
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev1.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))) (Scope::EE') O6
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev5.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Len: apply length_exists_list_pair_string_value to IsEE.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE N
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < rename N to LengthEE.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < NNS_L: assert newNameScopes [[]] LengthEE ([]::EE) EE.

Subgoal 6.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 newNameScopes [[]] LengthEE ([]::EE) EE
 < unfold .

Subgoal 6.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 exists N SNames BNames,
   ((((length EE LengthEE /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   Names.

Subgoal 6.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 ((((length EE LengthEE /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE Names) /\
 (forall X, mem X [] -> mem X Names -> false)
 < split.

Subgoal 6.1.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 length EE LengthEE
 < search.

Subgoal 6.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 6.1.3:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 6.1.4:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 names [[]] []
 < search.

Subgoal 6.1.5:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 names EE Names
 < search.

Subgoal 6.1.6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
============================
 forall X, mem X [] -> mem X Names -> false
 < intros M.

Subgoal 6.1.6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
M : mem X []
H3 : mem X Names
============================
 false
 < case M.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev_L: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ EN Ev NNS_L.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < NNS_L': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev Ev_L NNS_L.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B'
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < IsLenEE: apply length_is to Len.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B'
IsLenEE : is_integer LengthEE
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < P: apply plus_integer_total to _ IsLenEE with
        N1 = 1.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B'
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < LenEE+: assert length ([]::EE) N3.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B'
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Eq: assert EE_B' = EE5 /\
   Scope1 = [].

Subgoal 6.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B'
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
============================
 EE_B' = EE5 /\ Scope1 = []
 < NNS': case NNS_L'.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 N SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'1 : drop N (Scope1::EE5) EE_B'
NNS'2 : take N (Scope1::EE5) [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_B' = EE5 /\ Scope1 = []
 < Take: case NNS'2.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 N SNames BNames N4
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'1 : drop N ([]::EE5) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N4 = N
Take1 : take N4 EE5 []
============================
 EE_B' = EE5 /\ [] = []
 < case Take1.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 N SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'1 : drop N ([]::EE5) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N
============================
 EE_B' = EE5 /\ [] = []
 < compute Take.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'1 : drop 1 ([]::EE5) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 EE_B' = EE5 /\ [] = []
 < Drop: case NNS'1.

Subgoal 6.2.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N5 = 1
Drop1 : drop N5 EE5 EE_B'
============================
 EE_B' = EE5 /\ [] = []
 < Drop': case Drop1.

Subgoal 6.2.1.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE_B') O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE_B') Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 EE_B' = EE_B' /\ [] = []
 < search.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N5 = 1
Drop' : 1 + N6 = N5
Drop'1 : drop N6 L EE_B'
============================
 EE_B' = X::L /\ [] = []
 < G: apply drop_geq_0 to Drop'1.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N5 = 1
Drop' : 1 + N6 = N5
Drop'1 : drop N6 L EE_B'
G : N6 >= 0
============================
 EE_B' = X::L /\ [] = []
 < P': assert 1 + -1 = 0.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N5 = 1
Drop' : 1 + N6 = N5
Drop'1 : drop N6 L EE_B'
G : N6 >= 0
P' : 1 + -1 = 0
============================
 EE_B' = X::L /\ [] = []
 < apply drop_is_integer to Drop'1.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N5 = 1
Drop' : 1 + N6 = N5
Drop'1 : drop N6 L EE_B'
G : N6 >= 0
P' : 1 + -1 = 0
H3 : is_integer N6
============================
 EE_B' = X::L /\ [] = []
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N5 N6 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N5 = 1
Drop' : 1 + N6 = N5
Drop'1 : drop N6 L EE_B'
G : N6 >= 0
P' : 1 + -1 = 0
H3 : is_integer N6
H4 : is_integer N5
============================
 EE_B' = X::L /\ [] = []
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames N6 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N6 = 0
Drop'1 : drop N6 L EE_B'
G : N6 >= 0
P' : 1 + -1 = 0
H3 : is_integer N6
H4 : is_integer 0
============================
 EE_B' = X::L /\ [] = []
 < apply plus_integer_unique_addend to _ _ _ Drop' P'.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L EE_B'
G : -1 >= 0
P' : 1 + -1 = 0
H3 : is_integer -1
H4 : is_integer 0
============================
 EE_B' = X::L /\ [] = []
 < L: case G.

Subgoal 6.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3 SNames BNames L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::(X::L)) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::(X::L)) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : length EE_B' LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L EE_B'
P' : 1 + -1 = 0
H3 : is_integer -1
H4 : is_integer 0
L : 0 <= -1
============================
 EE_B' = X::L /\ [] = []
 < case L.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : newNameScopes [[]] LengthEE EE5 BR
============================
 Scope1::BR = EE5 /\ Scope1 = []
 < LenBR+: apply evalExpr_keep_scopes to _ _ _ Ev_L Len.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : newNameScopes [[]] LengthEE EE5 BR
LenBR+ : length (Scope1::BR) LengthEE
============================
 Scope1::BR = EE5 /\ Scope1 = []
 < LenBR: case LenBR+.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : newNameScopes [[]] LengthEE EE5 BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
============================
 Scope1::BR = EE5 /\ Scope1 = []
 < apply length_is to LenBR.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : newNameScopes [[]] LengthEE EE5 BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H3 : is_integer N'
============================
 Scope1::BR = EE5 /\ Scope1 = []
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : newNameScopes [[]] LengthEE EE5 BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H3 : is_integer N'
LEq : LengthEE <= N'
============================
 Scope1::BR = EE5 /\ Scope1 = []
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 6.2.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 BR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 (Scope1::BR) O1
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
NNS' : newNameScopes [[]] LengthEE EE5 BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H3 : is_integer N'
LEq : LengthEE <= N'
L : N' < LengthEE
============================
 Scope1::BR = EE5 /\ Scope1 = []
 < apply less_lesseq_flip_false to L LEq.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 Scope1 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE EE_B' N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 (Scope1::EE5) O1
Ev3 : evalExpr FE (((SaveL, V1)::Scope1)::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE_B' O1
NNS_L' : newNameScopes [[]] LengthEE (Scope1::EE5) EE_B'
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
Eq : EE_B' = EE5 /\ Scope1 = []
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < LenEE5: apply evalExpr_keep_scopes to _ _ _ Ev_L Len.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < IsEE5: apply evalExpr_isCtx to _ _ _ Ev_L.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < NamesEE5: apply names_exists to IsEE5.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < NNS_I: assert newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5.

Subgoal 6.3:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
 < unfold .

Subgoal 6.3:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 exists N SNames BNames,
   ((((length EE5 LengthEE /\ drop N ([(SaveL, V1)]::EE5) EE5) /\
   take N ([(SaveL, V1)]::EE5) [[(SaveL, V1)]]) /\
   names [[(SaveL, V1)]] SNames) /\
   names EE5 BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveL],
   N.

Subgoal 6.3:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 ((((length EE5 LengthEE /\ drop 1 ([(SaveL, V1)]::EE5) EE5) /\
 take 1 ([(SaveL, V1)]::EE5) [[(SaveL, V1)]]) /\
 names [[(SaveL, V1)]] [SaveL]) /\
 names EE5 N) /\
 (forall X, mem X [SaveL] -> mem X N -> false)
 < split.

Subgoal 6.3.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 length EE5 LengthEE
 < search.

Subgoal 6.3.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 drop 1 ([(SaveL, V1)]::EE5) EE5
 < search.

Subgoal 6.3.3:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 take 1 ([(SaveL, V1)]::EE5) [[(SaveL, V1)]]
 < search.

Subgoal 6.3.4:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 names [[(SaveL, V1)]] [SaveL]
 < search.

Subgoal 6.3.5:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 names EE5 N
 < search.

Subgoal 6.3.6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
============================
 forall X, mem X [SaveL] -> mem X N -> false
 < intros ML MN.

Subgoal 6.3.6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
ML : mem X [SaveL]
MN : mem X N
============================
 false
 < ML: case ML.

Subgoal 6.3.6.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
MN : mem SaveL N
============================
 false
 < NS: apply evalExpr_names_same to _ _ _ Ev_L.

Subgoal 6.3.6.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
MN : mem SaveL N
NS : names_same EE EE5
============================
 false
 < NS': apply names_same_symmetric to NS.

Subgoal 6.3.6.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
MN : mem SaveL N
NS : names_same EE EE5
NS' : names_same EE5 EE
============================
 false
 < MNames: apply names_same_names to _ NamesEE5 Names MN.

Subgoal 6.3.6.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
MN : mem SaveL N
NS : names_same EE EE5
NS' : names_same EE5 EE
MNames : mem SaveL Names
============================
 false
 < apply fresh_name_not_mem to Pr2 MNames.

Subgoal 6.3.6.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
MN : mem X N
ML : mem X []
============================
 false
 < case ML.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < apply evalExpr_ctx_names to _ _ _ _ _ EN Ev_L.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < apply fresh_name_is to _ Pr1.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < apply fresh_name_is to _ Pr2.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Ev_I: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ EN1 Ev3 NNS_I.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < NNS_I': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev3 Ev_I _.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE (Scope2::EE6) EE_B'1
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Eq: assert Scope2 = [(SaveL, V1)] /\
   EE_B'1 = EE6.

Subgoal 6.4:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE (Scope2::EE6) EE_B'1
============================
 Scope2 = [(SaveL, V1)] /\ EE_B'1 = EE6
 < NNS': case NNS_I'.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 N4 SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'1 : drop N4 (Scope2::EE6) EE_B'1
NNS'2 : take N4 (Scope2::EE6) [[(SaveL, V1)]]
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 Scope2 = [(SaveL, V1)] /\ EE_B'1 = EE6
 < Take: case NNS'2.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 N4 SNames BNames N5
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'1 : drop N4 ([(SaveL, V1)]::EE6) EE_B'1
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N5 = N4
Take1 : take N5 EE6 []
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE6
 < case Take1.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 N4 SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'1 : drop N4 ([(SaveL, V1)]::EE6) EE_B'1
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N4
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE6
 < compute Take.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'1 : drop 1 ([(SaveL, V1)]::EE6) EE_B'1
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE6
 < Drop: case NNS'1.

Subgoal 6.4.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop1 : drop N6 EE6 EE_B'1
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE6
 < Drop': case Drop1.

Subgoal 6.4.1.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE_B'1) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE_B'1) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = EE_B'1
 < search.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L EE_B'1
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
 < G: apply drop_geq_0 to Drop'1.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L EE_B'1
G : N7 >= 0
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
 < P': assert 1 + -1 = 0.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L EE_B'1
G : N7 >= 0
P' : 1 + -1 = 0
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
 < apply drop_is_integer to Drop'1.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L EE_B'1
G : N7 >= 0
P' : 1 + -1 = 0
H7 : is_integer N7
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N6 N7 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L EE_B'1
G : N7 >= 0
P' : 1 + -1 = 0
H7 : is_integer N7
H8 : is_integer N6
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames N7 L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N7 = 0
Drop'1 : drop N7 L EE_B'1
G : N7 >= 0
P' : 1 + -1 = 0
H7 : is_integer N7
H8 : is_integer 0
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
 < apply plus_integer_unique_addend to _ _ _ Drop' P'.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L EE_B'1
G : -1 >= 0
P' : 1 + -1 = 0
H7 : is_integer -1
H8 : is_integer 0
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
 < L: case G.

Subgoal 6.4.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1 SNames BNames L X
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::(X::L)) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::(X::L)) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS' : length EE_B'1 LengthEE
NNS'3 : names [[(SaveL, V1)]] SNames
NNS'4 : names EE_B'1 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L EE_B'1
P' : 1 + -1 = 0
H7 : is_integer -1
H8 : is_integer 0
L : 0 <= -1
============================
 [(SaveL, V1)] = [(SaveL, V1)] /\ EE_B'1 = X::L
 < case L.

Subgoal 6.4.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5
NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR
============================
 Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
 < LenBR+: apply evalExpr_keep_scopes to _ _ _ Ev_I LenEE5.

Subgoal 6.4.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5
NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR
LenBR+ : length (Scope2::BR) LengthEE
============================
 Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
 < LenBR: case LenBR+.

Subgoal 6.4.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5
NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
============================
 Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
 < apply length_is to LenBR.

Subgoal 6.4.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5
NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H7 : is_integer N'
============================
 Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 6.4.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5
NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H7 : is_integer N'
LEq : LengthEE <= N'
============================
 Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 6.4.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N BR N'
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 (Scope2::BR) O5
NNS' : newNameScopes [[(SaveL, V1)]] LengthEE EE6 BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H7 : is_integer N'
LEq : LengthEE <= N'
L : N' < LengthEE
============================
 Scope2 = [(SaveL, V1)] /\ Scope2::BR = EE6
 < apply less_lesseq_flip_false to L LEq.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Scope2 V2 Fields EE4 O7 O8 LengthEE N3 N EE_B'1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 (Scope2::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE (((SaveI, V2)::Scope2)::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE_B'1 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE (Scope2::EE6) EE_B'1
Eq : Scope2 = [(SaveL, V1)] /\ EE_B'1 = EE6
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < Eq: assert exists IV,
     ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
     O7 = [].

Subgoal 6.5:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < EvIf: case Ev5.

Subgoal 6.5.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9
EvIf1 : evalStmt FE ([]::EE7) (printVal (errorExpr (stringLit "Die") intTy)) (Scope3::EE4) O10
EvIf2 : O9 ++ O10 = O7
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < EvP: case EvIf1.

Subgoal 6.5.1.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 I O11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9
EvIf2 : O9 ++ O10 = O7
EvP : evalExpr FE ([]::EE7) (errorExpr (stringLit "Die") intTy) (intVal I) (Scope3::EE4) O11
EvP1 : O11 ++ [intVal I] = O10
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < case EvP.

Subgoal 6.5.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 O11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9
EvIf2 : O9 ++ O10 = O7
EvP : evalExpr FE ([]::EE7) (errorExpr (stringLit "Die") intTy) trueVal (Scope3::EE4) O11
EvP1 : O11 ++ [trueVal] = O10
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < case EvP.

Subgoal 6.5.1.3:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 O11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9
EvIf2 : O9 ++ O10 = O7
EvP : evalExpr FE ([]::EE7) (errorExpr (stringLit "Die") intTy) falseVal (Scope3::EE4) O11
EvP1 : O11 ++ [falseVal] = O10
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < case EvP.

Subgoal 6.5.1.4:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10 S O11
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) trueVal EE7 O9
EvIf2 : O9 ++ O10 = O7
EvP : evalExpr FE ([]::EE7) (errorExpr (stringLit "Die") intTy) (stringVal S) (Scope3::EE4) O11
EvP1 : O11 ++ [stringVal S] = O10
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < case EvP.

Subgoal 6.5.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N EE7 O9 Scope3 O10
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) falseVal EE7 O9
EvIf1 : evalStmt FE ([]::EE7) noop (Scope3::EE4) O10
EvIf2 : O9 ++ O10 = O7
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < case EvIf1.

Subgoal 6.5.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N O9
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (greater (num 0) (name SaveI)) falseVal EE4 O9
EvIf2 : O9 ++ [] = O7
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < EvG: case EvIf.

Subgoal 6.5.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N O9 I1 EE8 O11 I2 O12
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf2 : O9 ++ [] = O7
EvG : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (num 0) (intVal I1) EE8 O11
EvG1 : evalExpr FE EE8 (name SaveI) (intVal I2) EE4 O12
EvG2 : I1 <= I2
EvG3 : O11 ++ O12 = O9
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < case EvG.

Subgoal 6.5.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N O9 I2 O12
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf2 : O9 ++ [] = O7
EvG1 : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (name SaveI) (intVal I2) EE4 O12
EvG2 : 0 <= I2
EvG3 : [] ++ O12 = O9
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < case EvG3.

Subgoal 6.5.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N O9 I2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf2 : O9 ++ [] = O7
EvG1 : evalExpr FE ([(SaveI, V2), (SaveL, V1)]::EE6) (name SaveI) (intVal I2) EE4 O9
EvG2 : 0 <= I2
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < LS: case EvG1.

Subgoal 6.5.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O7 O8 LengthEE N3 N I2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvIf2 : [] ++ [] = O7
EvG2 : 0 <= I2
LS : lookupScopes SaveI ([(SaveI, V2), (SaveL, V1)]::EE6) (intVal I2)
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\
   [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   O7 = []
 < case EvIf2.

Subgoal 6.5.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvG2 : 0 <= I2
LS : lookupScopes SaveI ([(SaveI, V2), (SaveL, V1)]::EE6) (intVal I2)
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\
   [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   [] = []
 < LS: case LS.

Subgoal 6.5.2.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvG2 : 0 <= I2
LS : lookup [(SaveI, V2), (SaveL, V1)] SaveI (intVal I2)
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\
   [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   [] = []
 < L: case LS.

Subgoal 6.5.2.1.1:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N I2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal I2) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE ([(SaveI, intVal I2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal I2) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvG2 : 0 <= I2
============================
 exists IV,
   ((intVal I2 = intVal IV /\ IV >= 0) /\
   [(SaveI, intVal I2), (SaveL, V1)]::EE6 = [(SaveI, intVal I2), (SaveL, V1)]::EE6) /\
   [] = []
 < search.

Subgoal 6.5.2.1.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvG2 : 0 <= I2
L : SaveI = SaveI -> false
L1 : lookup [(SaveL, V1)] SaveI (intVal I2)
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\
   [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   [] = []
 < apply L to _.

Subgoal 6.5.2.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvG2 : 0 <= I2
LS : no_lookup [(SaveI, V2), (SaveL, V1)] SaveI
LS1 : lookupScopes SaveI EE6 (intVal I2)
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\
   [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   [] = []
 < NL: case LS.

Subgoal 6.5.2.2:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields O8 LengthEE N3 N I2
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev8 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
EvG2 : 0 <= I2
LS1 : lookupScopes SaveI EE6 (intVal I2)
NL : SaveI = SaveI -> false
NL1 : no_lookup [(SaveL, V1)] SaveI
============================
 exists IV,
   ((V2 = intVal IV /\ IV >= 0) /\
   [(SaveI, V2), (SaveL, V1)]::EE6 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
   [] = []
 < apply NL to _.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 V2 Fields EE4 O7 O8 LengthEE N3 N
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index V2 ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, V2), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) EE4 O7
Ev8 : evalStmt FE EE4 (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : O7 ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index V2 EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
Eq : exists IV,
       ((V2 = intVal IV /\ IV >= 0) /\ EE4 = [(SaveI, V2), (SaveL, V1)]::EE6) /\
       O7 = []
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < NEq: assert SaveL = SaveI -> false.

Subgoal 6.6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
============================
 SaveL = SaveI -> false
 < intros E.

Subgoal 6.6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
E : SaveL = SaveI
============================
 false
 < case E.

Subgoal 6.6:

Variables: Names FE EE V EE' O Ctx SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveI
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveI, V1)]::EE5) Index (intVal IV) ([(SaveI, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveI (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveI, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveI
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE6) EE6
H7 : IV >= 0
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 6.6:

Variables: Names FE EE V EE' O Ctx SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV S
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveI
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveI, V1)]::EE5) Index (intVal IV) ([(SaveI, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveI (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveI, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveI
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE6) EE6
H7 : IV >= 0
AppI : "I" ++ S = SaveI
============================
 false
 < AppL: apply fresh_name_start to _ Pr2.

Subgoal 6.6:

Variables: Names FE EE V EE' O Ctx SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV S S1
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveI Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveI) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveI
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveI, V1)]::EE5) Index (intVal IV) ([(SaveI, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveI (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveI, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveI, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (recFieldAccess (name SaveI) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveI
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveI, V1)]] LengthEE ([(SaveI, V1)]::EE6) EE6
H7 : IV >= 0
AppI : "I" ++ S = SaveI
AppL : "L" ++ S1 = SaveI
============================
 false
 < case AppI.

Subgoal 6.6:

Variables: Names FE EE V EE' O Ctx Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV S S1 L3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy ("I"::L3) Lst) (seq (declare intTy ("I"::L3) Index) (seq (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (recFieldAccess (name ("I"::L3)) "tail")) (assign ("I"::L3) (minus (name ("I"::L3)) (num 1)))))))) (recFieldAccess (name ("I"::L3)) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names ("I"::L3)
Pr2 : fresh_name "L" Names ("I"::L3)
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([("I"::L3, V1)]::EE5) Index (intVal IV) ([("I"::L3, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes ("I"::L3) (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([("I"::L3, intVal IV), ("I"::L3, V1)]::EE6) (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([("I"::L3, intVal IV), ("I"::L3, V1)]::EE6) []
Ev8 : evalStmt FE ([("I"::L3, intVal IV), ("I"::L3, V1)]::EE6) (while (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (recFieldAccess (name ("I"::L3)) "tail")) (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[("I"::L3, V1)]] LengthEE ([("I"::L3, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string ("I"::L3)
H5 : is_string ("I"::L3)
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[("I"::L3, V1)]] LengthEE ([("I"::L3, V1)]::EE6) EE6
H7 : IV >= 0
AppL : "L" ++ S1 = "I"::L3
H8 : [] ++ S = L3
============================
 false
 < case AppL.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields O8 LengthEE N3 N IV
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O8
Ev9 : [] ++ O8 = O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < case Ev9.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields LengthEE N3 N IV
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < IsI: apply evalExpr_isValue to _ _ _ Ev_I.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields LengthEE N3 N IV
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
IsI : is_value (intVal IV)
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < case IsI.

Subgoal 6:

Variables: Names FE EE V EE' O Ctx SaveL SaveI Index Lst O2 Scope O1 O4 O5 O6 EE5 V1 EE6 Fields LengthEE N3 N IV
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ O6 = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope::EE') (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope::EE') O6
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
H8 : is_integer IV
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE' EE''
 < apply while_to_index to Ev8 Ev1 Ev7 _ _ NEq.

Subgoal 6:

Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O2 O1 O4 O5 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O2 ++ [] = O
Ev4 : O1 ++ O4 = O2
Ev6 : O5 ++ [] = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) []
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
H8 : is_integer IV
H9 : listIndex V1 IV V
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE6 EE''
 < apply append_nil_right to Ev2.

Subgoal 6:

Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 O5 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O ++ [] = O
Ev4 : O1 ++ O4 = O
Ev6 : O5 ++ [] = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O5
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) []
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O5
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
H8 : is_integer IV
H9 : listIndex V1 IV V
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE6 EE''
 < apply append_nil_right to Ev6.

Subgoal 6:

Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O ++ [] = O
Ev4 : O1 ++ O4 = O
Ev6 : O4 ++ [] = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) []
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
H8 : is_integer IV
H9 : listIndex V1 IV V
============================
 exists EE'', evalExpr FE EE (index Lst Index) V EE'' O /\ scopes_same EE6 EE''
 < exists EE6.

Subgoal 6:

Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O ++ [] = O
Ev4 : O1 ++ O4 = O
Ev6 : O4 ++ [] = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) []
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
H8 : is_integer IV
H9 : listIndex V1 IV V
============================
 evalExpr FE EE (index Lst Index) V EE6 O /\ scopes_same EE6 EE6
 < split.

Subgoal 6.7:

Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O ++ [] = O
Ev4 : O1 ++ O4 = O
Ev6 : O4 ++ [] = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) []
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
H8 : is_integer IV
H9 : listIndex V1 IV V
============================
 evalExpr FE EE (index Lst Index) V EE6 O
 < search.

Subgoal 6.8:

Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O ++ [] = O
Ev4 : O1 ++ O4 = O
Ev6 : O4 ++ [] = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) []
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
H8 : is_integer IV
H9 : listIndex V1 IV V
============================
 scopes_same EE6 EE6
 < apply evalExpr_isCtx to _ _ _ Ev_I.

Subgoal 6.8:

Variables: Names FE EE V O Ctx SaveL SaveI Index Lst O1 O4 EE5 V1 EE6 Fields LengthEE N3 N IV Scope3
Pr : Names |{expr}- index Lst Index ~~> stmtExpr (seq (declare intTy SaveL Lst) (seq (declare intTy SaveI Index) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "I" Names SaveI
Pr2 : fresh_name "L" Names SaveL
H1 : is_expr Lst
H2 : is_expr Index
EN : exprNames Ctx Lst []
EN1 : exprNames Ctx Index []
Ev2 : O ++ [] = O
Ev4 : O1 ++ O4 = O
Ev6 : O4 ++ [] = O4
Ev : evalExpr FE ([]::EE) Lst V1 ([]::EE5) O1
Ev3 : evalExpr FE ([(SaveL, V1)]::EE5) Index (intVal IV) ([(SaveL, V1)]::EE6) O4
Ev7 : lookup Fields "head" V
Ev1 : lookupScopes SaveL (Scope3::EE6) (recVal Fields)
Ev5 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal IV), (SaveL, V1)]::EE6) []
Ev8 : evalStmt FE ([(SaveI, intVal IV), (SaveL, V1)]::EE6) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) (Scope3::EE6) []
Len : length EE LengthEE
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_L : evalExpr FE EE Lst V1 EE5 O1
NNS_L' : newNameScopes [[]] LengthEE ([]::EE5) EE5
IsLenEE : is_integer LengthEE
P : 1 + LengthEE = N3
LenEE+ : length ([]::EE) N3
LenEE5 : length EE5 LengthEE
IsEE5 : is_list (is_list (is_pair is_string is_value)) EE5
NamesEE5 : names EE5 N
NNS_I : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE5) EE5
H3 : ctx_names EE5 Ctx
H4 : is_string SaveI
H5 : is_string SaveL
H6 : is_value V1
Ev_I : evalExpr FE EE5 Index (intVal IV) EE6 O4
NNS_I' : newNameScopes [[(SaveL, V1)]] LengthEE ([(SaveL, V1)]::EE6) EE6
H7 : IV >= 0
NEq : SaveL = SaveI -> false
H8 : is_integer IV
H9 : listIndex V1 IV V
H10 : is_list (is_list (is_pair is_string is_value)) EE6
============================
 scopes_same EE6 EE6
 < backchain scopes_same_reflexive.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (exactEval:list:length E1) []
Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE' O
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < case IsE.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
EN : exprNames Ctx (exactEval:list:length E1) []
Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE' O
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < EN: case EN.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Ev : evalExpr FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) V EE' O
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 EE3 O2 Scope O3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) EE3 O2
Ev1 : evalExpr FE EE3 (name Len) V (Scope::EE') O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev1.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 O2 Scope
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (Scope::EE') O2
Ev2 : O2 ++ [] = O
Ev1 : lookupScopes Len (Scope::EE') V
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < apply append_nil_right to Ev2.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (Scope::EE') O
Ev2 : O ++ [] = O
Ev1 : lookupScopes Len (Scope::EE') V
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < clear Ev2.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (Scope::EE') O
Ev1 : lookupScopes Len (Scope::EE') V
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope EE1 O1 O4
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev : evalStmt FE ([]::EE) (declare intTy SaveL E1) EE1 O1
Ev2 : evalStmt FE EE1 (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))) (Scope::EE') O4
Ev3 : O1 ++ O4 = O
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 EE4 Scope1 V1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev2 : evalStmt FE (((SaveL, V1)::Scope1)::EE4) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))) (Scope::EE') O4
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE4) O1
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev2.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 EE4 Scope1 V1 EE2 O5 O6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE4) O1
Ev2 : evalStmt FE (((SaveL, V1)::Scope1)::EE4) (declare intTy Len (num 0)) EE2 O5
Ev4 : evalStmt FE EE2 (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O6
Ev5 : O5 ++ O6 = O4
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev2.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 EE4 Scope1 V1 O5 O6 EE6 Scope2 V2
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE4) O1
Ev4 : evalStmt FE (((Len, V2)::Scope2)::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O6
Ev5 : O5 ++ O6 = O4
Ev2 : evalExpr FE (((SaveL, V1)::Scope1)::EE4) (num 0) V2 (Scope2::EE6) O5
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < case Ev2.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 O6 EE6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O6
Ev5 : [] ++ O6 = O4
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < case Ev5.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < NNS: assert newNameScopes [[]] N ([]::EE) EE.

Subgoal 7.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 newNameScopes [[]] N ([]::EE) EE
 < unfold .

Subgoal 7.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 exists N1 SNames BNames,
   ((((length EE N /\ drop N1 ([]::EE) EE) /\ take N1 ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   Names.

Subgoal 7.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 ((((length EE N /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE Names) /\
 (forall X, mem X [] -> mem X Names -> false)
 < split.

Subgoal 7.1.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 length EE N
 < search.

Subgoal 7.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 7.1.3:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 7.1.4:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 names [[]] []
 < search.

Subgoal 7.1.5:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 names EE Names
 < search.

Subgoal 7.1.6:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
============================
 forall X, mem X [] -> mem X Names -> false
 < intros M.

Subgoal 7.1.6:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
M : mem X []
H2 : mem X Names
============================
 false
 < case M.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < Ev_E1: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ EN Ev NNS.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev Ev_E1 NNS.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N (Scope1::EE6) EE_B'
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < LenEE_B': apply evalExpr_keep_scopes to _ _ _ Ev_E1 LenEE.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N (Scope1::EE6) EE_B'
LenEE_B' : length EE_B' N
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < Eq: assert Scope1::EE6 = []::EE_B'.

Subgoal 7.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N (Scope1::EE6) EE_B'
LenEE_B' : length EE_B' N
============================
 Scope1::EE6 = []::EE_B'
 < NNS': case NNS'.

Subgoal 7.2.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B' N1 SNames BNames
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'1 : drop N1 (Scope1::EE6) EE_B'
NNS'2 : take N1 (Scope1::EE6) [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 Scope1::EE6 = []::EE_B'
 < Take: case NNS'2.

Subgoal 7.2.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 EE6 N EE_B' N1 SNames BNames N2
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE6) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'1 : drop N1 ([]::EE6) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 EE6 []
============================
 []::EE6 = []::EE_B'
 < case Take1.

Subgoal 7.2.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 EE6 N EE_B' N1 SNames BNames
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE6) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'1 : drop N1 ([]::EE6) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 []::EE6 = []::EE_B'
 < compute Take.

Subgoal 7.2.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 EE6 N EE_B' SNames BNames
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE6) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'1 : drop 1 ([]::EE6) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::EE6 = []::EE_B'
 < Drop: case NNS'1.

Subgoal 7.2.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 EE6 N EE_B' SNames BNames N3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE6) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop1 : drop N3 EE6 EE_B'
============================
 []::EE6 = []::EE_B'
 < Drop': case Drop1.

Subgoal 7.2.1.1:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 []::EE_B' = []::EE_B'
 < search.

Subgoal 7.2.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L EE_B'
============================
 []::(X::L) = []::EE_B'
 < G: apply drop_geq_0 to Drop'1.

Subgoal 7.2.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L EE_B'
G : N4 >= 0
============================
 []::(X::L) = []::EE_B'
 < P': assert 1 + -1 = 0.

Subgoal 7.2.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L EE_B'
G : N4 >= 0
P' : 1 + -1 = 0
============================
 []::(X::L) = []::EE_B'
 < apply drop_is_integer to Drop'1.

Subgoal 7.2.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L EE_B'
G : N4 >= 0
P' : 1 + -1 = 0
H2 : is_integer N4
============================
 []::(X::L) = []::EE_B'
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 7.2.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N3 N4 L X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N3 = 1
Drop' : 1 + N4 = N3
Drop'1 : drop N4 L EE_B'
G : N4 >= 0
P' : 1 + -1 = 0
H2 : is_integer N4
H3 : is_integer N3
============================
 []::(X::L) = []::EE_B'
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 7.2.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames N4 L X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N4 = 0
Drop'1 : drop N4 L EE_B'
G : N4 >= 0
P' : 1 + -1 = 0
H2 : is_integer N4
H3 : is_integer 0
============================
 []::(X::L) = []::EE_B'
 < apply plus_integer_unique_addend to _ _ _ Drop' P'.

Subgoal 7.2.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames L X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L EE_B'
G : -1 >= 0
P' : 1 + -1 = 0
H2 : is_integer -1
H3 : is_integer 0
============================
 []::(X::L) = []::EE_B'
 < L: case G.

Subgoal 7.2.1.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B' SNames BNames L X
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::(X::L)) O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::(X::L)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
LenEE_B' : length EE_B' N
NNS' : length EE_B' N
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L EE_B'
P' : 1 + -1 = 0
H2 : is_integer -1
H3 : is_integer 0
L : 0 <= -1
============================
 []::(X::L) = []::EE_B'
 < case L.

Subgoal 7.2.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1
LenEE_B' : length (Scope1::BR) N
NNS' : newNameScopes [[]] N EE6 BR
============================
 Scope1::EE6 = []::(Scope1::BR)
 < LenBR: case LenEE_B'.

Subgoal 7.2.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR N'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1
NNS' : newNameScopes [[]] N EE6 BR
LenBR : length BR N'
LenBR1 : 1 + N' = N
============================
 Scope1::EE6 = []::(Scope1::BR)
 < apply length_is to LenBR.

Subgoal 7.2.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR N'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1
NNS' : newNameScopes [[]] N EE6 BR
LenBR : length BR N'
LenBR1 : 1 + N' = N
H2 : is_integer N'
============================
 Scope1::EE6 = []::(Scope1::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 7.2.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR N'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1
NNS' : newNameScopes [[]] N EE6 BR
LenBR : length BR N'
LenBR1 : 1 + N' = N
H2 : is_integer N'
LEq : N <= N'
============================
 Scope1::EE6 = []::(Scope1::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 7.2.2:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N BR N'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 (Scope1::BR) O1
NNS' : newNameScopes [[]] N EE6 BR
LenBR : length BR N'
LenBR1 : 1 + N' = N
H2 : is_integer N'
LEq : N <= N'
L : N' < N
============================
 Scope1::EE6 = []::(Scope1::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 Scope1 V1 EE6 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 (Scope1::EE6) O1
Ev4 : evalStmt FE (((Len, intVal 0)::((SaveL, V1)::Scope1))::EE6) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N (Scope1::EE6) EE_B'
LenEE_B' : length EE_B' N
Eq : Scope1::EE6 = []::EE_B'
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < NEq: assert SaveL = Len -> false.

Subgoal 7.3:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
============================
 SaveL = Len -> false
 < intros E.

Subgoal 7.3:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
E : SaveL = Len
============================
 false
 < case E.

Subgoal 7.3:

Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names Len
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
============================
 false
 < AppLen: apply fresh_name_start to _ Pr2.

Subgoal 7.3:

Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names Len
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
AppLen : "Len" ++ S = Len
============================
 false
 < FrL: case Pr1.

Subgoal 7.3.1:

Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy "L" E1) (seq (declare intTy "L" (num 0)) (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))))) (name "L")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names "L"
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes "L" (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([("L", intVal 0), ("L", V1)]::EE_B') (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
AppLen : "Len" ++ S = "L"
FrL : not_mem "L" Names
============================
 false
 < App: case AppLen.

Subgoal 7.3.1:

Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy "L" E1) (seq (declare intTy "L" (num 0)) (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))))) (name "L")
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names "L"
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes "L" (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([("L", intVal 0), ("L", V1)]::EE_B') (while (not (recFieldAccess (name "L") "null")) (seq (assign "L" (recFieldAccess (name "L") "tail")) (assign "L" (plus (name "L") (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
FrL : not_mem "L" Names
App : "en" ++ S = []
============================
 false
 < case App.

Subgoal 7.3.2:

Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S NewBase
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
AppLen : "Len" ++ S = Len
FrL : mem "L" Names
FrL1 : "L" ++ "_" = NewBase
FrL2 : fresh_name NewBase Names Len
============================
 false
 < AppL: case FrL1.

Subgoal 7.3.2:

Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S L3
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
AppLen : "Len" ++ S = Len
FrL : mem "L" Names
FrL2 : fresh_name ("L"::L3) Names Len
AppL : [] ++ "_" = L3
============================
 false
 < case AppL.

Subgoal 7.3.2:

Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
AppLen : "Len" ++ S = Len
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names Len
============================
 false
 < AppL: apply fresh_name_start to _ FrL2.

Subgoal 7.3.2:

Variables: Names FE EE V EE' O Ctx Len E1 Scope O1 O4 V1 N EE_B' S S1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy Len E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (Len, V1)]::EE_B') (while (not (recFieldAccess (name Len) "null")) (seq (assign Len (recFieldAccess (name Len) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
AppLen : "Len" ++ S = Len
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names Len
AppL : "L_" ++ S1 = Len
============================
 false
 < AppL: case AppL.

Subgoal 7.3.2:

Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S S1 L1
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::L1) E1) (seq (declare intTy ("L"::L1) (num 0)) (while (not (recFieldAccess (name ("L"::L1)) "null")) (seq (assign ("L"::L1) (recFieldAccess (name ("L"::L1)) "tail")) (assign ("L"::L1) (plus (name ("L"::L1)) (num 1))))))) (name ("L"::L1))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names ("L"::L1)
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes ("L"::L1) (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([("L"::L1, intVal 0), ("L"::L1, V1)]::EE_B') (while (not (recFieldAccess (name ("L"::L1)) "null")) (seq (assign ("L"::L1) (recFieldAccess (name ("L"::L1)) "tail")) (assign ("L"::L1) (plus (name ("L"::L1)) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
AppLen : "Len" ++ S = "L"::L1
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names ("L"::L1)
AppL : "_" ++ S1 = L1
============================
 false
 < case AppL.

Subgoal 7.3.2:

Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S S1 L4
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::("_"::L4)) E1) (seq (declare intTy ("L"::("_"::L4)) (num 0)) (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))))) (name ("L"::("_"::L4)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names ("L"::("_"::L4))
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes ("L"::("_"::L4)) (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([("L"::("_"::L4), intVal 0), ("L"::("_"::L4), V1)]::EE_B') (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
AppLen : "Len" ++ S = "L"::("_"::L4)
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names ("L"::("_"::L4))
H2 : [] ++ S1 = L4
============================
 false
 < AppLen: case AppLen.

Subgoal 7.3.2:

Variables: Names FE EE V EE' O Ctx E1 Scope O1 O4 V1 N EE_B' S S1 L4
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy ("L"::("_"::L4)) E1) (seq (declare intTy ("L"::("_"::L4)) (num 0)) (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))))) (name ("L"::("_"::L4)))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr2 : fresh_name "Len" Names ("L"::("_"::L4))
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes ("L"::("_"::L4)) (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([("L"::("_"::L4), intVal 0), ("L"::("_"::L4), V1)]::EE_B') (while (not (recFieldAccess (name ("L"::("_"::L4))) "null")) (seq (assign ("L"::("_"::L4)) (recFieldAccess (name ("L"::("_"::L4))) "tail")) (assign ("L"::("_"::L4)) (plus (name ("L"::("_"::L4))) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
FrL : mem "L" Names
FrL2 : fresh_name "L_" Names ("L"::("_"::L4))
H2 : [] ++ S1 = L4
AppLen : "en" ++ S = "_"::L4
============================
 false
 < case AppLen.

Subgoal 7:

Variables: Names FE EE V EE' O Ctx Len SaveL E1 Scope O1 O4 V1 N EE_B'
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope::EE') V
Ev3 : O1 ++ O4 = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope::EE') O4
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) V EE'' O /\ scopes_same EE' EE''
 < LL: apply while_to_length to Ev4 Ev1 _ NEq.

Subgoal 7:

Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen CurrLen
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen)
Ev3 : O1 ++ [] = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') []
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
LL : listLength V1 CurrLen
LL1 : is_integer CurrLen
LL2 : CurrLen + 0 = TotalLen
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE'' O /\
   scopes_same EE_B' EE''
 < P: apply plus_integer_comm to _ _ LL2.

Subgoal 7:

Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen CurrLen
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen)
Ev3 : O1 ++ [] = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') []
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
LL : listLength V1 CurrLen
LL1 : is_integer CurrLen
LL2 : CurrLen + 0 = TotalLen
P : 0 + CurrLen = TotalLen
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE'' O /\
   scopes_same EE_B' EE''
 < case P.

Subgoal 7:

Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen)
Ev3 : O1 ++ [] = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') []
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
LL : listLength V1 TotalLen
LL1 : is_integer TotalLen
LL2 : TotalLen + 0 = TotalLen
============================
 exists EE'',
   evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE'' O /\
   scopes_same EE_B' EE''
 < exists EE_B'.

Subgoal 7:

Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen)
Ev3 : O1 ++ [] = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') []
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
LL : listLength V1 TotalLen
LL1 : is_integer TotalLen
LL2 : TotalLen + 0 = TotalLen
============================
 evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE_B' O /\
 scopes_same EE_B' EE_B'
 < split.

Subgoal 7.4:

Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen)
Ev3 : O1 ++ [] = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') []
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
LL : listLength V1 TotalLen
LL1 : is_integer TotalLen
LL2 : TotalLen + 0 = TotalLen
============================
 evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE_B' O
 < apply append_nil_right to Ev3.

Subgoal 7.4:

Variables: Names FE EE O Ctx Len SaveL E1 V1 N EE_B' Scope3 TotalLen
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen)
Ev3 : O ++ [] = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') []
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
LL : listLength V1 TotalLen
LL1 : is_integer TotalLen
LL2 : TotalLen + 0 = TotalLen
============================
 evalExpr FE EE (exactEval:list:length E1) (intVal TotalLen) EE_B' O
 < search.

Subgoal 7.5:

Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen)
Ev3 : O1 ++ [] = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') []
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
LL : listLength V1 TotalLen
LL1 : is_integer TotalLen
LL2 : TotalLen + 0 = TotalLen
============================
 scopes_same EE_B' EE_B'
 < apply evalExpr_isCtx to _ _ _ Ev_E1.

Subgoal 7.5:

Variables: Names FE EE O Ctx Len SaveL E1 O1 V1 N EE_B' Scope3 TotalLen
Pr : Names |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
Pr1 : fresh_name "L" Names SaveL
Pr2 : fresh_name "Len" Names Len
H1 : is_expr E1
EN : exprNames Ctx E1 []
Ev1 : lookupScopes Len (Scope3::EE_B') (intVal TotalLen)
Ev3 : O1 ++ [] = O
Ev : evalExpr FE ([]::EE) E1 V1 ([]::EE_B') O1
Ev4 : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE_B') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) (Scope3::EE_B') []
LenEE : length EE N
NNS : newNameScopes [[]] N ([]::EE) EE
Ev_E1 : evalExpr FE EE E1 V1 EE_B' O1
NNS' : newNameScopes [[]] N ([]::EE_B') EE_B'
LenEE_B' : length EE_B' N
NEq : SaveL = Len -> false
LL : listLength V1 TotalLen
LL1 : is_integer TotalLen
LL2 : TotalLen + 0 = TotalLen
H2 : is_list (is_list (is_pair is_string is_value)) EE_B'
============================
 scopes_same EE_B' EE_B'
 < backchain scopes_same_reflexive.

Proof completed.
 < Theorem drop_one  [A] :
     forall (D : list A) (L : list A), drop 1 L D -> exists S, L = S::D.

============================
 forall D L, drop 1 L D -> exists S, L = S::D
 < intros D.

Variables: D L
D : drop 1 L D
============================
 exists S, L = S::D
 < D: case D.

Variables: D N1 L1 X
D : 1 + N1 = 1
D1 : drop N1 L1 D
============================
 exists S, X::L1 = S::D
 < apply drop_is_integer to D1.

Variables: D N1 L1 X
D : 1 + N1 = 1
D1 : drop N1 L1 D
H1 : is_integer N1
============================
 exists S, X::L1 = S::D
 < D': case D1.

Subgoal 1:

Variables: D X
D : 1 + 0 = 1
H1 : is_integer 0
============================
 exists S, X::D = S::D
 < search.

Subgoal 2:

Variables: D N1 X N2 L2 X1
D : 1 + N1 = 1
H1 : is_integer N1
D' : 1 + N2 = N1
D'1 : drop N2 L2 D
============================
 exists S, X::(X1::L2) = S::D
 < apply drop_is_integer to D'1.

Subgoal 2:

Variables: D N1 X N2 L2 X1
D : 1 + N1 = 1
H1 : is_integer N1
D' : 1 + N2 = N1
D'1 : drop N2 L2 D
H2 : is_integer N2
============================
 exists S, X::(X1::L2) = S::D
 < P: assert 1 + 0 = 1.

Subgoal 2:

Variables: D N1 X N2 L2 X1
D : 1 + N1 = 1
H1 : is_integer N1
D' : 1 + N2 = N1
D'1 : drop N2 L2 D
H2 : is_integer N2
P : 1 + 0 = 1
============================
 exists S, X::(X1::L2) = S::D
 < apply plus_integer_unique_addend to _ _ _ D P.

Subgoal 2:

Variables: D X N2 L2 X1
D : 1 + 0 = 1
H1 : is_integer 0
D' : 1 + N2 = 0
D'1 : drop N2 L2 D
H2 : is_integer N2
P : 1 + 0 = 1
============================
 exists S, X::(X1::L2) = S::D
 < P': assert 1 + -1 = 0.

Subgoal 2:

Variables: D X N2 L2 X1
D : 1 + 0 = 1
H1 : is_integer 0
D' : 1 + N2 = 0
D'1 : drop N2 L2 D
H2 : is_integer N2
P : 1 + 0 = 1
P' : 1 + -1 = 0
============================
 exists S, X::(X1::L2) = S::D
 < apply plus_integer_unique_addend to _ _ _ D' P'.

Subgoal 2:

Variables: D X L2 X1
D : 1 + 0 = 1
H1 : is_integer 0
D' : 1 + -1 = 0
D'1 : drop -1 L2 D
H2 : is_integer -1
P : 1 + 0 = 1
P' : 1 + -1 = 0
============================
 exists S, X::(X1::L2) = S::D
 < GEq: apply drop_geq_0 to D'1.

Subgoal 2:

Variables: D X L2 X1
D : 1 + 0 = 1
H1 : is_integer 0
D' : 1 + -1 = 0
D'1 : drop -1 L2 D
H2 : is_integer -1
P : 1 + 0 = 1
P' : 1 + -1 = 0
GEq : -1 >= 0
============================
 exists S, X::(X1::L2) = S::D
 < LEq: case GEq.

Subgoal 2:

Variables: D X L2 X1
D : 1 + 0 = 1
H1 : is_integer 0
D' : 1 + -1 = 0
D'1 : drop -1 L2 D
H2 : is_integer -1
P : 1 + 0 = 1
P' : 1 + -1 = 0
LEq : 0 <= -1
============================
 exists S, X::(X1::L2) = S::D
 < case LEq.

Proof completed.
 < Theorem eval_while_names_same :
     forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O ->
       names_same EE EE'.

============================
 forall C B FE EE EE' O,
   is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O ->
   names_same EE EE'
 < induction on 5.

IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
============================
 forall C B FE EE EE' O,
   is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
   is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O @ ->
   names_same EE EE'
 < intros IsC IsB IsFE IsEE Ev.

Variables: C B FE EE EE' O
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (while C B) EE' O @
============================
 names_same EE EE'
 < Ev: case Ev.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
============================
 names_same EE EE'
 < NS: apply evalExpr_names_same to _ _ _ Ev.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
NS : names_same EE EE2
============================
 names_same EE EE'
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 Scope EE4 O3 O4 O12
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope::EE4) O3 *
Ev2 : evalStmt FE EE4 (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
NS : names_same EE EE2
H1 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 names_same EE EE'
 < NS1: apply evalStmt_names_same to _ _ _ Ev1.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE''
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 *
Ev2 : evalStmt FE EE'' (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
NS : names_same EE EE2
H1 : is_list (is_list (is_pair is_string is_value)) EE2
NS1 : names_same EE2 EE''
============================
 names_same EE EE'
 < Is+: apply evalStmt_isCtx to _ _ _ Ev1.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE''
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 *
Ev2 : evalStmt FE EE'' (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
NS : names_same EE EE2
H1 : is_list (is_list (is_pair is_string is_value)) EE2
NS1 : names_same EE2 EE''
Is+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
============================
 names_same EE EE'
 < case Is+.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE''
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 *
Ev2 : evalStmt FE EE'' (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
NS : names_same EE EE2
H1 : is_list (is_list (is_pair is_string is_value)) EE2
NS1 : names_same EE2 EE''
H2 : is_list (is_pair is_string is_value) Scope'
H3 : is_list (is_list (is_pair is_string is_value)) EE''
============================
 names_same EE EE'
 < NS2: apply IH to _ _ _ _ Ev2.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE''
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 *
Ev2 : evalStmt FE EE'' (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
NS : names_same EE EE2
H1 : is_list (is_list (is_pair is_string is_value)) EE2
NS1 : names_same EE2 EE''
H2 : is_list (is_pair is_string is_value) Scope'
H3 : is_list (is_list (is_pair is_string is_value)) EE''
NS2 : names_same EE'' EE'
============================
 names_same EE EE'
 < NS': apply names_same_transitive to NS NS1.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE''
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 *
Ev2 : evalStmt FE EE'' (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
NS : names_same EE EE2
H1 : is_list (is_list (is_pair is_string is_value)) EE2
NS1 : names_same EE2 EE''
H2 : is_list (is_pair is_string is_value) Scope'
H3 : is_list (is_list (is_pair is_string is_value)) EE''
NS2 : names_same EE'' EE'
NS' : names_same EE EE''
============================
 names_same EE EE'
 < apply names_same_transitive to NS' NS2.

Subgoal 1:

Variables: C B FE EE EE' O EE2 O2 O3 O4 O12 Scope' EE''
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C trueVal EE2 O2 *
Ev1 : evalStmt FE ([]::EE2) B (Scope'::EE'') O3 *
Ev2 : evalStmt FE EE'' (while C B) EE' O4 *
Ev3 : O2 ++ O3 = O12
Ev4 : O12 ++ O4 = O
NS : names_same EE EE2
H1 : is_list (is_list (is_pair is_string is_value)) EE2
NS1 : names_same EE2 EE''
H2 : is_list (is_pair is_string is_value) Scope'
H3 : is_list (is_list (is_pair is_string is_value)) EE''
NS2 : names_same EE'' EE'
NS' : names_same EE EE''
H4 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Subgoal 2:

Variables: C B FE EE EE' O
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C falseVal EE' O *
============================
 names_same EE EE'
 < apply evalExpr_names_same to _ _ _ Ev.

Subgoal 2:

Variables: C B FE EE EE' O
IH : forall C B FE EE EE' O,
       is_expr C -> is_stmt B -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE (while C B) EE' O * ->
       names_same EE EE'
IsC : is_expr C
IsB : is_stmt B
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE C falseVal EE' O *
H1 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Proof completed.
 < Theorem names_lookupScopes :
     forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names -> mem X Names ->
       exists V, lookupScopes X Ctx V.

============================
 forall Ctx X Names,
   is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names -> mem X Names ->
   exists V, lookupScopes X Ctx V
 < induction on 2.

IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
============================
 forall Ctx X Names,
   is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names @ -> mem X Names ->
   exists V, lookupScopes X Ctx V
 < intros IsCtx Names Mem.

Variables: Ctx X Names
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
IsCtx : is_list (is_list (is_pair is_string is_value)) Ctx
Names : names Ctx Names @
Mem : mem X Names
============================
 exists V, lookupScopes X Ctx V
 < apply names_is to _ Names.

Variables: Ctx X Names
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
IsCtx : is_list (is_list (is_pair is_string is_value)) Ctx
Names : names Ctx Names @
Mem : mem X Names
H1 : is_list is_string Names
============================
 exists V, lookupScopes X Ctx V
 < Names: case Names.

Subgoal 1:

Variables: X
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
IsCtx : is_list (is_list (is_pair is_string is_value)) []
Mem : mem X []
H1 : is_list is_string []
============================
 exists V, lookupScopes X [] V
 < case Mem.

Subgoal 2:

Variables: X Names NScope NRest Rest Scope
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
IsCtx : is_list (is_list (is_pair is_string is_value)) (Scope::Rest)
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
============================
 exists V, lookupScopes X (Scope::Rest) V
 < Is: case IsCtx.

Subgoal 2:

Variables: X Names NScope NRest Rest Scope
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
============================
 exists V, lookupScopes X (Scope::Rest) V
 < IsX: apply mem_is_string to _ Mem.

Subgoal 2:

Variables: X Names NScope NRest Rest Scope
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
============================
 exists V, lookupScopes X (Scope::Rest) V
 < Or: apply mem_append to Mem Names2.

Subgoal 2:

Variables: X Names NScope NRest Rest Scope
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
Or : mem X NScope \/ mem X NRest
============================
 exists V, lookupScopes X (Scope::Rest) V
 < M: case Or.

Subgoal 2.1:

Variables: X Names NScope NRest Rest Scope
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
M : mem X NScope
============================
 exists V, lookupScopes X (Scope::Rest) V
 < MXB: apply mem_domain to Names M.

Subgoal 2.1:

Variables: X Names NScope NRest Rest Scope B
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
M : mem X NScope
MXB : mem (X, B) Scope
============================
 exists V, lookupScopes X (Scope::Rest) V
 < L: apply mem_lookup to _ MXB.

Subgoal 2.1:

Variables: X Names NScope NRest Rest Scope B V'
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
M : mem X NScope
MXB : mem (X, B) Scope
L : lookup Scope X V'
============================
 exists V, lookupScopes X (Scope::Rest) V
 < search.

Subgoal 2.2:

Variables: X Names NScope NRest Rest Scope
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
M : mem X NRest
============================
 exists V, lookupScopes X (Scope::Rest) V
 < Or: apply lookup_string_value_list_or_no to Is IsX.

Subgoal 2.2:

Variables: X Names NScope NRest Rest Scope
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
M : mem X NRest
Or : (exists V, lookup Scope X V) \/ no_lookup Scope X
============================
 exists V, lookupScopes X (Scope::Rest) V
 < case Or.

Subgoal 2.2.1:

Variables: X Names NScope NRest Rest Scope V
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
M : mem X NRest
H2 : lookup Scope X V
============================
 exists V, lookupScopes X (Scope::Rest) V
 < search.

Subgoal 2.2.2:

Variables: X Names NScope NRest Rest Scope
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
M : mem X NRest
H2 : no_lookup Scope X
============================
 exists V, lookupScopes X (Scope::Rest) V
 < LS: apply IH to _ Names1 M.

Subgoal 2.2.2:

Variables: X Names NScope NRest Rest Scope V
IH : forall Ctx X Names,
       is_list (is_list (is_pair is_string is_value)) Ctx -> names Ctx Names * ->
       mem X Names -> exists V, lookupScopes X Ctx V
Mem : mem X Names
H1 : is_list is_string Names
Names : domain Scope NScope
Names1 : names Rest NRest *
Names2 : NScope ++ NRest = Names
Is : is_list (is_pair is_string is_value) Scope
Is1 : is_list (is_list (is_pair is_string is_value)) Rest
IsX : is_string X
M : mem X NRest
H2 : no_lookup Scope X
LS : lookupScopes X Rest V
============================
 exists V, lookupScopes X (Scope::Rest) V
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalStmt_forward.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < Is: case IsS.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert SaveE = L -> false.

Subgoal 1.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
============================
 SaveE = L -> false
 < intros E.

Subgoal 1.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
E : SaveE = L
============================
 false
 < case E.

Subgoal 1.1:

Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy L E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name L)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) L
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
============================
 false
 < apply fresh_name_not_mem to Pr3 _.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert SaveI = L -> false.

Subgoal 1.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
============================
 SaveI = L -> false
 < intros E.

Subgoal 1.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
E : SaveI = L
============================
 false
 < case E.

Subgoal 1.2:

Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy L I) (seq (declare intTy SaveE E) (seq (assign L (name L)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) L
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert Hold = L -> false.

Subgoal 1.3:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
============================
 Hold = L -> false
 < intros E.

Subgoal 1.3:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
E : Hold = L
============================
 false
 < case E.

Subgoal 1.3:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy L (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name L))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) L
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
============================
 false
 < apply fresh_name_not_mem to Pr2 _.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert Copy = L -> false.

Subgoal 1.4:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
============================
 Copy = L -> false
 < intros E.

Subgoal 1.4:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
E : Copy = L
============================
 false
 < case E.

Subgoal 1.4:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy L (name L)) (seq (recUpdate L ["tail"] (name Hold)) (seq (assign Hold (name L)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy L (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy L (name Hold)) (seq (recUpdate L ["tail"] (name L)) (seq (assign L (name L)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) L
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
============================
 false
 < apply fresh_name_not_mem to Pr4 _.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert Hold = SaveE -> false.

Subgoal 1.5:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
============================
 Hold = SaveE -> false
 < intros E.

Subgoal 1.5:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
E : Hold = SaveE
============================
 false
 < case E.

Subgoal 1.5:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
H4 : Copy = L -> false
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.5:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
H4 : Copy = L -> false
AppE : "E" ++ S1 = SaveE
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.5.1:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
H4 : Copy = L -> false
AppE : "E" ++ S1 = SaveE
============================
 is_string "Hold"
 < search 6.

Subgoal 1.5:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
H4 : Copy = L -> false
AppE : "E" ++ S1 = SaveE
AppH : "Hold" ++ S2 = SaveE
============================
 false
 < case AppE.

Subgoal 1.5:

Variables: Names FE EE EE' O Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("E"::L3)
Pr3 : fresh_name "E" (L::Names) ("E"::L3)
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : "E"::L3 = L -> false
H2 : SaveI = L -> false
H3 : "E"::L3 = L -> false
H4 : Copy = L -> false
AppH : "Hold" ++ S2 = "E"::L3
H5 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert Hold = SaveI -> false.

Subgoal 1.6:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
============================
 Hold = SaveI -> false
 < intros E.

Subgoal 1.6:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
E : Hold = SaveI
============================
 false
 < case E.

Subgoal 1.6:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : Copy = L -> false
H5 : SaveI = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.6:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : Copy = L -> false
H5 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.6.1:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : Copy = L -> false
H5 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1.6:

Variables: Names FE EE EE' O Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : Copy = L -> false
H5 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
AppH : "Hold" ++ S2 = SaveI
============================
 false
 < case AppI.

Subgoal 1.6:

Variables: Names FE EE EE' O Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) ("I"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : "I"::L3 = L -> false
H3 : "I"::L3 = L -> false
H4 : Copy = L -> false
H5 : "I"::L3 = SaveE -> false
AppH : "Hold" ++ S2 = "I"::L3
H6 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < NEqIE: assert SaveI = SaveE -> false.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
============================
 SaveI = SaveE -> false
 < intros E.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
E : SaveI = SaveE
============================
 false
 < case E.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
AppE : "E" ++ S2 = SaveE
============================
 false
 < case AppI.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold Copy L E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) ("I"::L3)
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : "I"::L3 = L -> false
H2 : "I"::L3 = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = "I"::L3 -> false
H6 : Hold = "I"::L3 -> false
AppE : "E" ++ S2 = "I"::L3
H7 : [] ++ S1 = L3
============================
 false
 < case AppE.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert Copy = Hold -> false.

Subgoal 1.8:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 Copy = Hold -> false
 < intros E.

Subgoal 1.8:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
E : Copy = Hold
============================
 false
 < case E.

Subgoal 1.8:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Hold
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 1.8:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Hold
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
AppC : "C" ++ S1 = Hold
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.8.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Hold
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
AppC : "C" ++ S1 = Hold
============================
 is_string "Hold"
 < search 6.

Subgoal 1.8:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Hold
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
AppC : "C" ++ S1 = Hold
AppH : "Hold" ++ S2 = Hold
============================
 false
 < case AppC.

Subgoal 1.8:

Variables: Names FE EE EE' O L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("C"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) ("C"::L3)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : "C"::L3 = L -> false
H4 : "C"::L3 = L -> false
H5 : "C"::L3 = SaveE -> false
H6 : "C"::L3 = SaveI -> false
NEqIE : SaveI = SaveE -> false
AppH : "Hold" ++ S2 = "C"::L3
H7 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert SaveE = Copy -> false.

Subgoal 1.9:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
============================
 SaveE = Copy -> false
 < intros E.

Subgoal 1.9:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
E : SaveE = Copy
============================
 false
 < case E.

Subgoal 1.9:

Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) Copy
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : Copy = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = Copy -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = Copy -> false
H7 : Copy = Hold -> false
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 1.9:

Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) Copy
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : Copy = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = Copy -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = Copy -> false
H7 : Copy = Hold -> false
AppC : "C" ++ S1 = Copy
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.9:

Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) Copy
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : Copy = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = Copy -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = Copy -> false
H7 : Copy = Hold -> false
AppC : "C" ++ S1 = Copy
AppE : "E" ++ S2 = Copy
============================
 false
 < case AppC.

Subgoal 1.9:

Variables: Names FE EE EE' O Hold L SaveI E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) ("C"::L3)
Pr4 : fresh_name "C" (L::Names) ("C"::L3)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : "C"::L3 = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : "C"::L3 = L -> false
H5 : Hold = "C"::L3 -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = "C"::L3 -> false
H7 : "C"::L3 = Hold -> false
AppE : "E" ++ S2 = "C"::L3
H8 : [] ++ S1 = L3
============================
 false
 < case AppE.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < assert SaveI = Copy -> false.

Subgoal 1.10:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
============================
 SaveI = Copy -> false
 < intros E.

Subgoal 1.10:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
E : SaveI = Copy
============================
 false
 < case E.

Subgoal 1.10:

Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) Copy
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : Copy = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = Copy -> false
NEqIE : Copy = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 1.10:

Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) Copy
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : Copy = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = Copy -> false
NEqIE : Copy = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
AppC : "C" ++ S1 = Copy
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.10:

Variables: Names FE EE EE' O Hold Copy L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) Copy
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : Copy = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = Copy -> false
NEqIE : Copy = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
AppC : "C" ++ S1 = Copy
AppI : "I" ++ S2 = Copy
============================
 false
 < case AppC.

Subgoal 1.10:

Variables: Names FE EE EE' O Hold L SaveE E I N EE2 O2 V EE4 O3 LV LV2 S1 S2 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("C"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("C"::L3) (name ("C"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("C"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("C"::L3) (minus (name ("C"::L3)) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) ("C"::L3)
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) ("C"::L3)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : "C"::L3 = L -> false
H3 : Hold = L -> false
H4 : "C"::L3 = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = "C"::L3 -> false
NEqIE : "C"::L3 = SaveE -> false
H7 : "C"::L3 = Hold -> false
H8 : SaveE = "C"::L3 -> false
AppI : "I" ++ S2 = "C"::L3
H9 : [] ++ S1 = L3
============================
 false
 < case AppI.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE N1
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < rename N1 to Len.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < NNS: assert newNameScopes [[]] Len ([]::EE) EE.

Subgoal 1.11:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 newNameScopes [[]] Len ([]::EE) EE
 < unfold .

Subgoal 1.11:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 exists N SNames BNames,
   ((((length EE Len /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   Names.

Subgoal 1.11:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 ((((length EE Len /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE Names) /\
 (forall X, mem X [] -> mem X Names -> false)
 < split.

Subgoal 1.11.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 length EE Len
 < search.

Subgoal 1.11.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 1.11.3:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 1.11.4:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 names [[]] []
 < search.

Subgoal 1.11.5:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 names EE Names
 < search.

Subgoal 1.11.6:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
============================
 forall X, mem X [] -> mem X Names -> false
 < intros M.

Subgoal 1.11.6:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
M : mem X []
H10 : mem X Names
============================
 false
 < case M.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < EvI': apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvI' Ev _.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2
NNS' : newNameScopes [[]] Len EE_A' EE2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < Eq: assert EE_A' = []::EE2.

Subgoal 1.12:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2
NNS' : newNameScopes [[]] Len EE_A' EE2
============================
 EE_A' = []::EE2
 < NNS': case NNS'.

Subgoal 1.12.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A' N1 SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2
NNS' : length EE2 Len
NNS'1 : drop N1 EE_A' EE2
NNS'2 : take N1 EE_A' [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A' = []::EE2
 < Take: case NNS'2.

Subgoal 1.12.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 SNames BNames N2 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::L1) O2
NNS' : length EE2 Len
NNS'1 : drop N1 ([]::L1) EE2
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 L1 []
============================
 []::L1 = []::EE2
 < case Take1.

Subgoal 1.12.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 SNames BNames L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::L1) O2
NNS' : length EE2 Len
NNS'1 : drop N1 ([]::L1) EE2
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 []::L1 = []::EE2
 < compute Take.

Subgoal 1.12.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len SNames BNames L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::L1) O2
NNS' : length EE2 Len
NNS'1 : drop 1 ([]::L1) EE2
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::L1 = []::EE2
 < apply drop_one to NNS'1.

Subgoal 1.12.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : length EE2 Len
NNS'1 : drop 1 ([]::EE2) EE2
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::EE2 = []::EE2
 < search.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
============================
 S1::AR = []::(S1::BR)
 < LenBR+: apply evalExpr_keep_scopes to _ _ _ Ev LenEE.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR+ : length (S1::BR) Len
============================
 S1::AR = []::(S1::BR)
 < LenBR: case LenBR+.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
============================
 S1::AR = []::(S1::BR)
 < apply length_is to LenBR.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
============================
 S1::AR = []::(S1::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
L : N' < Len
============================
 S1::AR = []::(S1::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N O2 V EE4 O3 LV LV2 Len BR S1 AR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
L : N' < Len
LEq : Len <= N'
============================
 S1::AR = []::(S1::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len EE_A'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) EE_A' O2
NNS' : newNameScopes [[]] Len EE_A' EE2
Eq : EE_A' = []::EE2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < case Eq.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < EvAI: assert evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < IsEE2: apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < Names2: apply names_exists to IsEE2.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < NS: apply evalExpr_names_same to _ _ _ Ev.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < Len2: apply evalExpr_keep_scopes to _ _ _ Ev LenEE.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < NNS+: assert newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2.

Subgoal 1.13:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
 < unfold .

Subgoal 1.13:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 exists N1 SNames BNames,
   ((((length EE2 Len /\ drop N1 ([(SaveI, intVal N)]::EE2) EE2) /\
   take N1 ([(SaveI, intVal N)]::EE2) [[(SaveI, intVal N)]]) /\
   names [[(SaveI, intVal N)]] SNames) /\
   names EE2 BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveI],
   N1.

Subgoal 1.13:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 ((((length EE2 Len /\ drop 1 ([(SaveI, intVal N)]::EE2) EE2) /\
 take 1 ([(SaveI, intVal N)]::EE2) [[(SaveI, intVal N)]]) /\
 names [[(SaveI, intVal N)]] [SaveI]) /\
 names EE2 N1) /\
 (forall X, mem X [SaveI] -> mem X N1 -> false)
 < split.

Subgoal 1.13.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 length EE2 Len
 < search.

Subgoal 1.13.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 drop 1 ([(SaveI, intVal N)]::EE2) EE2
 < search.

Subgoal 1.13.3:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 take 1 ([(SaveI, intVal N)]::EE2) [[(SaveI, intVal N)]]
 < search.

Subgoal 1.13.4:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 names [[(SaveI, intVal N)]] [SaveI]
 < search.

Subgoal 1.13.5:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 names EE2 N1
 < search.

Subgoal 1.13.6:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 forall X, mem X [SaveI] -> mem X N1 -> false
 < intros M MX.

Subgoal 1.13.6:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
M : mem X [SaveI]
MX : mem X N1
============================
 false
 < M: case M.

Subgoal 1.13.6.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
MX : mem SaveI N1
============================
 false
 < NS': apply names_same_symmetric to NS.

Subgoal 1.13.6.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
MX : mem SaveI N1
NS' : names_same EE2 EE
============================
 false
 < M': apply names_same_names to NS' Names2 Names MX.

Subgoal 1.13.6.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
MX : mem SaveI N1
NS' : names_same EE2 EE
M' : mem SaveI Names
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 1.13.6.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
MX : mem X N1
M : mem X []
============================
 false
 < case M.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < EvE': apply evalExpr_newNameScopes_exists to _ _ _ _ Ev1 NNS+.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvE' Ev1 _.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len EE_A'1 EE4
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < Len4: apply evalExpr_keep_scopes to _ _ _ Ev1 Len2.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len EE_A'1 EE4
Len4 : length EE4 Len
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < Eq: assert EE_A'1 = [(SaveI, intVal N)]::EE4.

Subgoal 1.14:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len EE_A'1 EE4
Len4 : length EE4 Len
============================
 EE_A'1 = [(SaveI, intVal N)]::EE4
 < NN: case NNS''.

Subgoal 1.14.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1 N2 SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop N2 EE_A'1 EE4
NN2 : take N2 EE_A'1 [[(SaveI, intVal N)]]
NN3 : names [[(SaveI, intVal N)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A'1 = [(SaveI, intVal N)]::EE4
 < Take: case NN2.

Subgoal 1.14.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 N2 SNames BNames N3 L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::L1) O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop N2 ([(SaveI, intVal N)]::L1) EE4
NN3 : names [[(SaveI, intVal N)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N3 = N2
Take1 : take N3 L1 []
============================
 [(SaveI, intVal N)]::L1 = [(SaveI, intVal N)]::EE4
 < Take: case Take1.

Subgoal 1.14.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 N2 SNames BNames L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::L1) O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop N2 ([(SaveI, intVal N)]::L1) EE4
NN3 : names [[(SaveI, intVal N)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N2
============================
 [(SaveI, intVal N)]::L1 = [(SaveI, intVal N)]::EE4
 < compute Take.

Subgoal 1.14.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 SNames BNames L1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::L1) O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop 1 ([(SaveI, intVal N)]::L1) EE4
NN3 : names [[(SaveI, intVal N)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveI, intVal N)]::L1 = [(SaveI, intVal N)]::EE4
 < apply drop_one to NN1.

Subgoal 1.14.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop 1 ([(SaveI, intVal N)]::EE4) EE4
NN3 : names [[(SaveI, intVal N)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveI, intVal N)]::EE4 = [(SaveI, intVal N)]::EE4
 < search.

Subgoal 1.14.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
Ev2 : lookupScopes L (S1::BR) LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 (S1::BR) EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3
Len4 : length (S1::BR) Len
NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR
============================
 S1::AR = [(SaveI, intVal N)]::(S1::BR)
 < LenBR: case Len4.

Subgoal 1.14.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
Ev2 : lookupScopes L (S1::BR) LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 (S1::BR) EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3
NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
============================
 S1::AR = [(SaveI, intVal N)]::(S1::BR)
 < apply length_is to LenBR.

Subgoal 1.14.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
Ev2 : lookupScopes L (S1::BR) LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 (S1::BR) EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3
NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H12 : is_integer N'
============================
 S1::AR = [(SaveI, intVal N)]::(S1::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 1.14.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
Ev2 : lookupScopes L (S1::BR) LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 (S1::BR) EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3
NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H12 : is_integer N'
L : N' < Len
============================
 S1::AR = [(SaveI, intVal N)]::(S1::BR)
 < LEq: apply newNameScopes_length to NN LenBR.

Subgoal 1.14.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V O3 LV LV2 Len N1 BR S1 AR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
Ev2 : lookupScopes L (S1::BR) LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 (S1::BR) EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V (S1::AR) O3
NN : newNameScopes [[(SaveI, intVal N)]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H12 : is_integer N'
L : N' < Len
LEq : Len <= N'
============================
 S1::AR = [(SaveI, intVal N)]::(S1::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 EE_A'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V EE_A'1 O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len EE_A'1 EE4
Len4 : length EE4 Len
Eq : EE_A'1 = [(SaveI, intVal N)]::EE4
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < case Eq.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < EvAE: assert evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < apply fresh_name_is to _ Pr3.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < IsEE4: apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < EvMI: assert evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) [].

Subgoal 1.15:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
 < assert SaveE = SaveI -> false.

Subgoal 1.15.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 SaveE = SaveI -> false
 < intros E.

Subgoal 1.15.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
E : SaveE = SaveI
============================
 false
 < case E.

Subgoal 1.15.1:

Variables: Names FE EE EE' O Hold Copy L SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveI E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveI)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveI
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveI = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveI -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveI -> false
H7 : Copy = Hold -> false
H8 : SaveI = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveI E) ([(SaveI, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveI
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 false
 < backchain NEqIE.

Subgoal 1.15:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
H14 : SaveE = SaveI -> false
============================
 evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
 < search.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < EvH: assert evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (exactEval:list:nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) [].

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < IsSaveI: apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < IsHold: apply fresh_name_is to _ Pr2.

Subgoal 1.16:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < IsCopy: apply fresh_name_is to _ Pr4.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < GEq: apply updateListIndex_pos to Ev3.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < Main: apply proj_listUpdate_eval to _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ with
           OldL = LV
           I = N
           V = V
           NewL = LV2
           Hold = Hold
           Copy = Copy
           SaveI = SaveI
           SaveE = SaveE G = EE4 L = L HoldL = recVal [("null", trueVal)].

Subgoal 1.17:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4)
 < search 12.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < apply drop_proj_rel_evalStmt to Main.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE'' O /\
   scopes_same EE' EE''
 < exists G'.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
============================
 evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) G' O /\
 scopes_same EE' G'
 < IsO3: apply evalExpr_isOutput to _ _ _ Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
============================
 evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) G' O /\
 scopes_same EE' G'
 < apply is_list_values_append_nil to IsO3.

Subgoal 1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
============================
 evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) G' O /\
 scopes_same EE' G'
 < split.

Subgoal 1.18:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
============================
 evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) G' O
 < search 20.

Subgoal 1.19:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
============================
 scopes_same EE' G'
 < FO: case Main3.

Subgoal 1.19.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 G' LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
FO : lookup [("null", trueVal)] "null" trueVal
============================
 scopes_same EE' G'
 < apply replaceScopes_unique to Main2 Ev4.

Subgoal 1.19.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 EE'
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
FO : lookup [("null", trueVal)] "null" trueVal
============================
 scopes_same EE' EE'
 < apply lookupScopes_is to _ Ev2.

Subgoal 1.19.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 EE'
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
FO : lookup [("null", trueVal)] "null" trueVal
H17 : is_value LV
H18 : is_string L
============================
 scopes_same EE' EE'
 < apply updateListIndex_is to _ _ Ev3.

Subgoal 1.19.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 EE'
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
FO : lookup [("null", trueVal)] "null" trueVal
H17 : is_value LV
H18 : is_string L
H19 : is_value LV1
============================
 scopes_same EE' EE'
 < apply replaceScopes_is to _ _ Main2.

Subgoal 1.19.1:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV Len N1 LV1 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 EE'
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::EE') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
FO : lookup [("null", trueVal)] "null" trueVal
H17 : is_value LV
H18 : is_string L
H19 : is_value LV1
H20 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 scopes_same EE' EE'
 < backchain scopes_same_reflexive.

Subgoal 1.19.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Fields' T
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
FO : lookup [("null", trueVal)] "null" falseVal
FO1 : lookup [("null", trueVal)] "tail" T
FO2 : replaceRecVal "tail" LV2 [("null", trueVal)] Fields'
FO3 : flipOnto T (recVal Fields') LV1
============================
 scopes_same EE' G'
 < L: case FO.

Subgoal 1.19.2:

Variables: Names FE EE EE' O Hold Copy L SaveE SaveI E I N EE2 O2 V EE4 O3 LV LV2 Len N1 G' LV1 HFs Fields' T
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
Ev2 : lookupScopes L EE4 LV
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE4 EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Copy = L -> false
H5 : Hold = SaveE -> false
H6 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H7 : Copy = Hold -> false
H8 : SaveE = Copy -> false
H9 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE ([]::EE) I (intVal N) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
EvAI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE2) O2
H10 : is_string SaveI
H11 : is_value (intVal N)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N1
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE2) EE2
EvE' : evalExpr FE ([(SaveI, intVal N)]::EE2) E V ([(SaveI, intVal N)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N)]] Len ([(SaveI, intVal N)]::EE4) EE4
Len4 : length EE4 Len
EvAE : evalStmt FE ([(SaveI, intVal N)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE4) O3
H12 : is_string SaveE
H13 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE4) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N >= 0
H14 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
H15 : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H16 : O3 ++ [] = O3
FO1 : lookup [("null", trueVal)] "tail" T
FO2 : replaceRecVal "tail" LV2 [("null", trueVal)] Fields'
FO3 : flipOnto T (recVal Fields') LV1
L : "null" = "null" -> false
L1 : lookup [] "null" falseVal
============================
 scopes_same EE' G'
 < apply L to _.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O
Pr1 : fresh_name "L" (X::Names) SaveL
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < case IsS.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < NS: apply evalExpr_names_same to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < NS': apply names_same_symmetric to NS.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < IsEE3: apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < Names3: apply names_exists to IsEE3.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < IsN: apply names_is to _ Names3.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < Fr: apply fresh_name_exists to _ _ with
         Base = "L" Names = X::N.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < apply fresh_name_unique_mems to Fr Pr1 _ _.

Subgoal 2.1:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
============================
 forall X1, mem X1 (X::Names) -> mem X1 (X::N)
 < intros M.

Subgoal 2.1:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
M : mem X1 (X::Names)
============================
 mem X1 (X::N)
 < M: case M.

Subgoal 2.1.1:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
============================
 mem X (X::N)
 < search.

Subgoal 2.1.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
M : mem X1 Names
============================
 mem X1 (X::N)
 < apply names_same_names to NS Names Names3 M.

Subgoal 2.1.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
M : mem X1 Names
H5 : mem X1 N
============================
 mem X1 (X::N)
 < search.

Subgoal 2.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
============================
 forall X1, mem X1 (X::N) -> mem X1 (X::Names)
 < intros M.

Subgoal 2.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
M : mem X1 (X::N)
============================
 mem X1 (X::Names)
 < M: case M.

Subgoal 2.2.1:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
============================
 mem X (X::Names)
 < search.

Subgoal 2.2.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
M : mem X1 N
============================
 mem X1 (X::Names)
 < apply names_same_names to NS' Names3 Names M.

Subgoal 2.2.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) F
M : mem X1 N
H5 : mem X1 Names
============================
 mem X1 (X::Names)
 < search.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < apply iterateList_to_while to _ _ _ _ _ Ev1 Names3 Fr.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < Len: apply length_exists_list_pair_string_value to IsEE.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < NNS: assert newNameScopes [[]] N1 ([]::EE) EE.

Subgoal 2.3:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 newNameScopes [[]] N1 ([]::EE) EE
 < unfold .

Subgoal 2.3:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 exists N SNames BNames,
   ((((length EE N1 /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   Names.

Subgoal 2.3:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 ((((length EE N1 /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE Names) /\
 (forall X, mem X [] -> mem X Names -> false)
 < split.

Subgoal 2.3.1:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 length EE N1
 < search.

Subgoal 2.3.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 2.3.3:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 2.3.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 names [[]] []
 < search.

Subgoal 2.3.5:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 names EE Names
 < search.

Subgoal 2.3.6:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
============================
 forall X, mem X [] -> mem X Names -> false
 < intros M.

Subgoal 2.3.6:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
M : mem X1 []
H6 : mem X1 Names
============================
 false
 < case M.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < Ev': apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 EE_A'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV EE_A' O2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev' Ev NNS.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 EE_A'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV EE_A' O2
NNS' : newNameScopes [[]] N1 EE_A' EE3
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < NNS': case NNS'.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 EE_A' N2 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV EE_A' O2
NNS' : length EE3 N1
NNS'1 : drop N2 EE_A' EE3
NNS'2 : take N2 EE_A' [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < Take: case NNS'2.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 N2 SNames BNames N3 L1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2
NNS' : length EE3 N1
NNS'1 : drop N2 ([]::L1) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N3 = N2
Take1 : take N3 L1 []
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < case Take1.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 N2 SNames BNames L1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2
NNS' : length EE3 N1
NNS'1 : drop N2 ([]::L1) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N2
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < compute Take.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2
NNS' : length EE3 N1
NNS'1 : drop 1 ([]::L1) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < Drop: case NNS'1.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1 N4
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N4 = 1
Drop1 : drop N4 L1 EE3
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < apply drop_is_integer to Drop1.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1 N4
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N4 = 1
Drop1 : drop N4 L1 EE3
H6 : is_integer N4
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE3
H6 : is_integer 0
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < Eq: assert L1 = EE3.

Subgoal 2.4.1:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE3
H6 : is_integer 0
============================
 L1 = EE3
 < D: case Drop1.

Subgoal 2.4.1.1:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
============================
 EE3 = EE3
 < search.

Subgoal 2.4.1.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames N5 L2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N5 = 0
D1 : drop N5 L2 EE3
============================
 X1::L2 = EE3
 < apply drop_is_integer to D1.

Subgoal 2.4.1.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames N5 L2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N5 = 0
D1 : drop N5 L2 EE3
H7 : is_integer N5
============================
 X1::L2 = EE3
 < P: assert 1 + -1 = 0.

Subgoal 2.4.1.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames N5 L2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + N5 = 0
D1 : drop N5 L2 EE3
H7 : is_integer N5
P : 1 + -1 = 0
============================
 X1::L2 = EE3
 < apply plus_integer_unique_addend to _ _ _ P D.

Subgoal 2.4.1.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE3
H7 : is_integer -1
P : 1 + -1 = 0
============================
 X1::L2 = EE3
 < GEq: apply drop_geq_0 to D1.

Subgoal 2.4.1.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE3
H7 : is_integer -1
P : 1 + -1 = 0
GEq : -1 >= 0
============================
 X1::L2 = EE3
 < LEq: case GEq.

Subgoal 2.4.1.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::(X1::L2)) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H6 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE3
H7 : is_integer -1
P : 1 + -1 = 0
LEq : 0 <= -1
============================
 X1::L2 = EE3
 < case LEq.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames L1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::L1) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE3
H6 : is_integer 0
Eq : L1 = EE3
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < case Eq.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE3 EE3
H6 : is_integer 0
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < clear Take
   Drop
   Drop1.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < exists EE'.

Subgoal 2.4:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
============================
 evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O /\
 scopes_same EE' EE'
 < split.

Subgoal 2.4.2:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
============================
 evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O
 < search.

Subgoal 2.4.3:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
============================
 scopes_same EE' EE'
 < apply iterateList_isCtx to _ _ _ _ _ Ev1.

Subgoal 2.4.3:

Variables: Names FE EE EE' O Body SaveL X L LV EE3 O2 O3 N V' N1 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : iterateList FE EE3 LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE EE3
NS' : names_same EE3 EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names3 : names EE3 N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS' : length EE3 N1
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H6 : is_integer 0
H7 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 scopes_same EE' EE'
 < backchain scopes_same_reflexive.

Subgoal 2.5:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV (S1::BR) O2
Ev1 : iterateList FE (S1::BR) LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE (S1::BR)
NS' : names_same (S1::BR) EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names3 : names (S1::BR) N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS' : newNameScopes [[]] N1 AR BR
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < LenBR+: apply names_same_length to NS Len.

Subgoal 2.5:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV (S1::BR) O2
Ev1 : iterateList FE (S1::BR) LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE (S1::BR)
NS' : names_same (S1::BR) EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names3 : names (S1::BR) N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS' : newNameScopes [[]] N1 AR BR
LenBR+ : length (S1::BR) N1
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < LenBR: case LenBR+.

Subgoal 2.5:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR N'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV (S1::BR) O2
Ev1 : iterateList FE (S1::BR) LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE (S1::BR)
NS' : names_same (S1::BR) EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names3 : names (S1::BR) N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS' : newNameScopes [[]] N1 AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N1
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 2.5:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR N'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV (S1::BR) O2
Ev1 : iterateList FE (S1::BR) LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE (S1::BR)
NS' : names_same (S1::BR) EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names3 : names (S1::BR) N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS' : newNameScopes [[]] N1 AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N1
LEq : N1 <= N'
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < apply length_is to LenBR.

Subgoal 2.5:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR N'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV (S1::BR) O2
Ev1 : iterateList FE (S1::BR) LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE (S1::BR)
NS' : names_same (S1::BR) EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names3 : names (S1::BR) N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS' : newNameScopes [[]] N1 AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N1
LEq : N1 <= N'
H6 : is_integer N'
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 2.5:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 N V' N1 BR S1 AR N'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalExpr FE EE L LV (S1::BR) O2
Ev1 : iterateList FE (S1::BR) LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
NS : names_same EE (S1::BR)
NS' : names_same (S1::BR) EE
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names3 : names (S1::BR) N
IsN : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
H5 : evalStmt FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS' : newNameScopes [[]] N1 AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N1
LEq : N1 <= N'
H6 : is_integer N'
L : N' < N1
============================
 exists EE'',
   evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\
   scopes_same EE' EE''
 < apply less_lesseq_flip_false to L LEq.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalStmt_backward.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case IsS.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply fresh_name_is to _ Pr3.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply fresh_name_is to _ Pr2.

Subgoal 1.1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply fresh_name_is to _ Pr4.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqHI: assert Hold = SaveI -> false.

Subgoal 1.2:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
============================
 Hold = SaveI -> false
 < intros E.

Subgoal 1.2:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
E : Hold = SaveI
============================
 false
 < case E.

Subgoal 1.2:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string SaveI
H7 : is_string Copy
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.2:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveI (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveI))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveI (tail (name SaveI))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string SaveI
H7 : is_string Copy
AppI : "I" ++ S1 = SaveI
============================
 false
 < case AppI.

Subgoal 1.2:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) ("I"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string ("I"::L3)
H5 : is_string SaveE
H6 : is_string ("I"::L3)
H7 : is_string Copy
H8 : [] ++ S1 = L3
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.2.1:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) ("I"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string ("I"::L3)
H5 : is_string SaveE
H6 : is_string ("I"::L3)
H7 : is_string Copy
H8 : [] ++ S1 = L3
============================
 is_string "Hold"
 < search 6.

Subgoal 1.2:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE E I S1 L3 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy ("I"::L3) (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("I"::L3))) (seq (assign ("I"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("I"::L3)))) (seq (declare intTy Copy (name ("I"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("I"::L3) (tail (name ("I"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) ("I"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string ("I"::L3)
H5 : is_string SaveE
H6 : is_string ("I"::L3)
H7 : is_string Copy
H8 : [] ++ S1 = L3
AppH : "Hold" ++ S2 = "I"::L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqHL: assert Hold = L -> false.

Subgoal 1.3:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
============================
 Hold = L -> false
 < intros E.

Subgoal 1.3:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
E : Hold = L
============================
 false
 < case E.

Subgoal 1.3:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy L (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name L))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy L (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name L))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign L (tail (name L))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) L
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string L
H7 : is_string Copy
NEqHI : L = SaveI -> false
============================
 false
 < apply fresh_name_not_mem to Pr2 _.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqIE: assert SaveI = SaveE -> false.

Subgoal 1.4:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
============================
 SaveI = SaveE -> false
 < intros E.

Subgoal 1.4:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
E : SaveI = SaveE
============================
 false
 < case E.

Subgoal 1.4:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveE
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveE -> false
NEqHL : Hold = L -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.4:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveE I) (seq (declare intTy SaveE E) (seq (assign SaveE (name SaveE)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveE) (num 0))) (not (null (name L)))) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveE
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveE -> false
NEqHL : Hold = L -> false
AppI : "I" ++ S1 = SaveE
============================
 false
 < case AppI.

Subgoal 1.4:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) ("I"::L3)
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string ("I"::L3)
H5 : is_string ("I"::L3)
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = "I"::L3 -> false
NEqHL : Hold = L -> false
H8 : [] ++ S1 = L3
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.4:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L E I S1 L3 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy ("I"::L3) E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("I"::L3))) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) ("I"::L3)
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string ("I"::L3)
H5 : is_string ("I"::L3)
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = "I"::L3 -> false
NEqHL : Hold = L -> false
H8 : [] ++ S1 = L3
AppE : "E" ++ S2 = "I"::L3
============================
 false
 < case AppE.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqIL: assert SaveI = L -> false.

Subgoal 1.5:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
============================
 SaveI = L -> false
 < intros E.

Subgoal 1.5:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
E : SaveI = L
============================
 false
 < case E.

Subgoal 1.5:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy L I) (seq (declare intTy SaveE E) (seq (assign L (name L)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy L I) (seq (declare intTy SaveE E) (seq (assign L (name L)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name L) (num 0))) (not (null (name L)))) (seq (assign L (minus (name L) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) L
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string L
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = L -> false
NEqHL : Hold = L -> false
NEqIE : L = SaveE -> false
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqHE: assert Hold = SaveE -> false.

Subgoal 1.6:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
============================
 Hold = SaveE -> false
 < intros E.

Subgoal 1.6:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
E : Hold = SaveE
============================
 false
 < case E.

Subgoal 1.6:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string SaveE
H7 : is_string Copy
NEqHI : SaveE = SaveI -> false
NEqHL : SaveE = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.6:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveE SaveI E I S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy SaveE (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name SaveE))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign SaveE (tail (name SaveE))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string SaveE
H7 : is_string Copy
NEqHI : SaveE = SaveI -> false
NEqHL : SaveE = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
AppE : "E" ++ S1 = SaveE
============================
 false
 < case AppE.

Subgoal 1.6:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveI E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("E"::L3)
Pr3 : fresh_name "E" (L::Names) ("E"::L3)
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string ("E"::L3)
H6 : is_string ("E"::L3)
H7 : is_string Copy
NEqHI : "E"::L3 = SaveI -> false
NEqHL : "E"::L3 = L -> false
NEqIE : SaveI = "E"::L3 -> false
NEqIL : SaveI = L -> false
H8 : [] ++ S1 = L3
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.6.1:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveI E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("E"::L3)
Pr3 : fresh_name "E" (L::Names) ("E"::L3)
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string ("E"::L3)
H6 : is_string ("E"::L3)
H7 : is_string Copy
NEqHI : "E"::L3 = SaveI -> false
NEqHL : "E"::L3 = L -> false
NEqIE : SaveI = "E"::L3 -> false
NEqIL : SaveI = L -> false
H8 : [] ++ S1 = L3
============================
 is_string "Hold"
 < search 6.

Subgoal 1.6:

Variables: Names FE EE EE' O Ctx Ctx' Copy L SaveI E I S1 L3 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("E"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("E"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name ("E"::L3))) (seq (assign ("E"::L3) (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("E"::L3))) (while (not (null (name ("E"::L3)))) (seq (declare intTy Copy (name ("E"::L3))) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign ("E"::L3) (tail (name ("E"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("E"::L3)
Pr3 : fresh_name "E" (L::Names) ("E"::L3)
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string ("E"::L3)
H6 : is_string ("E"::L3)
H7 : is_string Copy
NEqHI : "E"::L3 = SaveI -> false
NEqHL : "E"::L3 = L -> false
NEqIE : SaveI = "E"::L3 -> false
NEqIL : SaveI = L -> false
H8 : [] ++ S1 = L3
AppH : "Hold" ++ S2 = "E"::L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqEL: assert SaveE = L -> false.

Subgoal 1.7:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
============================
 SaveE = L -> false
 < intros E.

Subgoal 1.7:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
E : SaveE = L
============================
 false
 < case E.

Subgoal 1.7:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy L E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name L)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy L E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name L)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) L
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string L
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = L -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = L -> false
============================
 false
 < apply fresh_name_not_mem to Pr3 _.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqCH: assert Copy = Hold -> false.

Subgoal 1.8:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
============================
 Copy = Hold -> false
 < intros E.

Subgoal 1.8:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
E : Copy = Hold
============================
 false
 < case E.

Subgoal 1.8:

Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Hold
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Hold
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 1.8:

Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE SaveI E I S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Hold (name L)) (seq (recUpdate Hold ["tail"] (name Hold)) (seq (assign Hold (name Hold)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Hold (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Hold (name Hold)) (seq (recUpdate Hold ["tail"] (name L)) (seq (assign L (name Hold)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Hold
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Hold
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
AppC : "C" ++ S1 = Hold
============================
 false
 < case AppC.

Subgoal 1.8:

Variables: Names FE EE EE' O Ctx Ctx' L SaveE SaveI E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("C"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) ("C"::L3)
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string ("C"::L3)
H7 : is_string ("C"::L3)
NEqHI : "C"::L3 = SaveI -> false
NEqHL : "C"::L3 = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : "C"::L3 = SaveE -> false
NEqEL : SaveE = L -> false
H8 : [] ++ S1 = L3
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.8.1:

Variables: Names FE EE EE' O Ctx Ctx' L SaveE SaveI E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("C"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) ("C"::L3)
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string ("C"::L3)
H7 : is_string ("C"::L3)
NEqHI : "C"::L3 = SaveI -> false
NEqHL : "C"::L3 = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : "C"::L3 = SaveE -> false
NEqEL : SaveE = L -> false
H8 : [] ++ S1 = L3
============================
 is_string "Hold"
 < search 6.

Subgoal 1.8:

Variables: Names FE EE EE' O Ctx Ctx' L SaveE SaveI E I S1 L3 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy ("C"::L3) (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name ("C"::L3))) (seq (assign ("C"::L3) (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name ("C"::L3)))) (seq (declare intTy ("C"::L3) (name ("C"::L3))) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign ("C"::L3) (tail (name ("C"::L3)))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("C"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) ("C"::L3)
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string ("C"::L3)
H7 : is_string ("C"::L3)
NEqHI : "C"::L3 = SaveI -> false
NEqHL : "C"::L3 = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : "C"::L3 = SaveE -> false
NEqEL : SaveE = L -> false
H8 : [] ++ S1 = L3
AppH : "Hold" ++ S2 = "C"::L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqCL: assert Copy = L -> false.

Subgoal 1.9:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
============================
 Copy = L -> false
 < intros E.

Subgoal 1.9:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
E : Copy = L
============================
 false
 < case E.

Subgoal 1.9:

Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy L (name L)) (seq (recUpdate L ["tail"] (name Hold)) (seq (assign Hold (name L)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy L (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy L (name Hold)) (seq (recUpdate L ["tail"] (name L)) (seq (assign L (name L)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy L (name L)) (seq (recUpdate L ["tail"] (name Hold)) (seq (assign Hold (name L)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy L (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy L (name Hold)) (seq (recUpdate L ["tail"] (name L)) (seq (assign L (name L)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) L
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string L
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : L = Hold -> false
============================
 false
 < apply fresh_name_not_mem to Pr4 _.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqIC: assert SaveI = Copy -> false.

Subgoal 1.10:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
============================
 SaveI = Copy -> false
 < intros E.

Subgoal 1.10:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
E : SaveI = Copy
============================
 false
 < case E.

Subgoal 1.10:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) Copy
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string Copy
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = Copy -> false
NEqHL : Hold = L -> false
NEqIE : Copy = SaveE -> false
NEqIL : Copy = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.10:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE E I S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy Copy I) (seq (declare intTy SaveE E) (seq (assign Copy (name Copy)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name Copy) (num 0))) (not (null (name L)))) (seq (assign Copy (minus (name Copy) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) Copy
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string Copy
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = Copy -> false
NEqHL : Hold = L -> false
NEqIE : Copy = SaveE -> false
NEqIL : Copy = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
AppI : "I" ++ S1 = Copy
============================
 false
 < case AppI.

Subgoal 1.10:

Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy ("I"::L3) (name L)) (seq (recUpdate ("I"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("I"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("I"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("I"::L3) (name Hold)) (seq (recUpdate ("I"::L3) ["tail"] (name L)) (seq (assign L (name ("I"::L3))) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy ("I"::L3) (name L)) (seq (recUpdate ("I"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("I"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("I"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("I"::L3) (name Hold)) (seq (recUpdate ("I"::L3) ["tail"] (name L)) (seq (assign L (name ("I"::L3))) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) ("I"::L3)
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string ("I"::L3)
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string ("I"::L3)
NEqHI : Hold = "I"::L3 -> false
NEqHL : Hold = L -> false
NEqIE : "I"::L3 = SaveE -> false
NEqIL : "I"::L3 = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : "I"::L3 = Hold -> false
NEqCL : "I"::L3 = L -> false
H8 : [] ++ S1 = L3
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 1.10:

Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveE E I S1 L3 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy ("I"::L3) (name L)) (seq (recUpdate ("I"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("I"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("I"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("I"::L3) (name Hold)) (seq (recUpdate ("I"::L3) ["tail"] (name L)) (seq (assign L (name ("I"::L3))) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy ("I"::L3) I) (seq (declare intTy SaveE E) (seq (assign ("I"::L3) (name ("I"::L3))) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name ("I"::L3)) (num 0))) (not (null (name L)))) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (declare intTy ("I"::L3) (name L)) (seq (recUpdate ("I"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("I"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("I"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy ("I"::L3) (name Hold)) (seq (recUpdate ("I"::L3) ["tail"] (name L)) (seq (assign L (name ("I"::L3))) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) ("I"::L3)
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string ("I"::L3)
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string ("I"::L3)
NEqHI : Hold = "I"::L3 -> false
NEqHL : Hold = L -> false
NEqIE : "I"::L3 = SaveE -> false
NEqIL : "I"::L3 = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : "I"::L3 = Hold -> false
NEqCL : "I"::L3 = L -> false
H8 : [] ++ S1 = L3
AppC : "C" ++ S2 = "I"::L3
============================
 false
 < case AppC.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NEqEC: assert SaveE = Copy -> false.

Subgoal 1.11:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
============================
 SaveE = Copy -> false
 < intros E.

Subgoal 1.11:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
E : SaveE = Copy
============================
 false
 < case E.

Subgoal 1.11:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) Copy
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string Copy
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = Copy -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = Copy -> false
NEqEL : Copy = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 1.11:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveI E I S1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy Copy E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name Copy)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) Copy
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string Copy
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = Copy -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = Copy -> false
NEqEL : Copy = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
AppC : "C" ++ S1 = Copy
============================
 false
 < case AppC.

Subgoal 1.11:

Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveI E I S1 L3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) ("C"::L3)
Pr4 : fresh_name "C" (L::Names) ("C"::L3)
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string ("C"::L3)
H6 : is_string Hold
H7 : is_string ("C"::L3)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = "C"::L3 -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = "C"::L3 -> false
NEqEL : "C"::L3 = L -> false
NEqCH : "C"::L3 = Hold -> false
NEqCL : "C"::L3 = L -> false
NEqIC : SaveI = "C"::L3 -> false
H8 : [] ++ S1 = L3
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.11:

Variables: Names FE EE EE' O Ctx Ctx' Hold L SaveI E I S1 L3 S2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy ("C"::L3) E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy ("C"::L3) (name L)) (seq (recUpdate ("C"::L3) ["tail"] (name Hold)) (seq (assign Hold (name ("C"::L3))) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy ("C"::L3) (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name ("C"::L3))) (while (not (null (name Hold))) (seq (declare intTy ("C"::L3) (name Hold)) (seq (recUpdate ("C"::L3) ["tail"] (name L)) (seq (assign L (name ("C"::L3))) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) ("C"::L3)
Pr4 : fresh_name "C" (L::Names) ("C"::L3)
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string ("C"::L3)
H6 : is_string Hold
H7 : is_string ("C"::L3)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = "C"::L3 -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = "C"::L3 -> false
NEqEL : "C"::L3 = L -> false
NEqCH : "C"::L3 = Hold -> false
NEqCL : "C"::L3 = L -> false
NEqIC : SaveI = "C"::L3 -> false
H8 : [] ++ S1 = L3
AppE : "E" ++ S2 = "C"::L3
============================
 false
 < case AppE.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listUpdate L I E) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < SN: case SN.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I NI NE
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I NI
SN2 : exprNames Ctx' E NE
SN3 : NI ++ NE = []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case SN3.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))) EE' O
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))))) (Scope::EE') O
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope EE3 O2 O3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev : evalStmt FE ([]::EE) (declare intTy SaveI I) EE3 O2
Ev1 : evalStmt FE EE3 (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvI: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev1 : evalStmt FE (((SaveI, V)::Scope1)::EE2) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V EE1 O1 O4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev : evalStmt FE (((SaveI, V)::Scope1)::EE2) (declare intTy SaveE E) EE1 O1
Ev1 : evalStmt FE EE1 (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) (Scope::EE') O4
Ev3 : O1 ++ O4 = O3
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvE: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev1 : evalStmt FE (((SaveE, V1)::Scope2)::EE5) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))))) (Scope::EE') O4
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O5 O6
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev : evalStmt FE (((SaveE, V1)::Scope2)::EE5) (assign SaveI (name SaveI)) EE4 O5
Ev1 : evalStmt FE EE4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) (Scope::EE') O6
Ev4 : O5 ++ O6 = O4
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvMI: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O5 O6 V2 EE6
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev1 : evalStmt FE EE4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) (Scope::EE') O6
Ev4 : O5 ++ O6 = O4
EvMI : evalExpr FE (((SaveE, V1)::Scope2)::EE5) (name SaveI) V2 EE6 O5
EvMI1 : replaceScopes SaveI V2 EE6 EE4
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < LI: case EvMI.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O6 V2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev1 : evalStmt FE EE4 (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))) (Scope::EE') O6
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) EE4
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O6 V2 EE7 O7 O8
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) EE4
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
Ev : evalStmt FE EE4 (declare intTy Hold (nil intTy)) EE7 O7
Ev1 : evalStmt FE EE7 (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) (Scope::EE') O8
Ev5 : O7 ++ O8 = O6
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 EE4 O6 V2 O7 O8 EE9 Scope3 V3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) EE4
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
Ev1 : evalStmt FE (((Hold, V3)::Scope3)::EE9) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) (Scope::EE') O8
Ev5 : O7 ++ O8 = O6
Ev : evalExpr FE EE4 (nil intTy) V3 (Scope3::EE9) O7
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 O8 EE9 Scope3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
Ev1 : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) (Scope::EE') O8
Ev5 : [] ++ O8 = O6
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Ev5.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
Ev1 : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) (Scope::EE') O6
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvW: case Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : evalStmt FE EE8 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) (Scope::EE') O10
EvW2 : O9 ++ O10 = O6
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ev: case EvW1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW2 : O9 ++ O10 = O6
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11
Ev1 : evalStmt FE EE10 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) (Scope::EE') O12
Ev5 : O11 ++ O12 = O10
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvA: case Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW2 : O9 ++ O10 = O6
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvA1 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < rename EvW2 to EvW1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvA1 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < rename EvA1 to EvW2.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvNL: assert (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\
   O11 = [].

Subgoal 1.12:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
============================
 (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
 < Ev: case Ev.

Subgoal 1.12.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 O15 Scope4 O16
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
Ev : evalExpr FE EE8 (null (name L)) trueVal EE12 O15
Ev1 : evalStmt FE ([]::EE12) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) (Scope4::EE10) O16
Ev6 : O15 ++ O16 = O11
============================
 (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
 < EvD: case Ev1.

Subgoal 1.12.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 O15 O16 Scope5 V4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
Ev : evalExpr FE EE8 (null (name L)) trueVal EE12 O15
Ev6 : O15 ++ O16 = O11
EvD : evalExpr FE ([]::EE12) (errorExpr (stringLit "Invalid update") intTy) V4 (Scope5::EE10) O16
============================
 (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
 < case EvD.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 O15 Scope4 O16
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
Ev : evalExpr FE EE8 (null (name L)) falseVal EE12 O15
Ev1 : evalStmt FE ([]::EE12) noop (Scope4::EE10) O16
Ev6 : O15 ++ O16 = O11
============================
 (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
 < EvL: case Ev.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 O15 Scope4 O16 Fields
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
Ev1 : evalStmt FE ([]::EE12) noop (Scope4::EE10) O16
Ev6 : O15 ++ O16 = O11
EvL : evalExpr FE EE8 (name L) (recVal Fields) EE12 O15
EvL1 : lookup Fields "null" falseVal
============================
 (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\ O11 = []
 < case EvL.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 O9 O10 EE10 O11 O12 EE11 O13 O14 EE12 Scope4 O16 Fields
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O9
EvW1 : O9 ++ O10 = O6
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
Ev1 : evalStmt FE ([]::EE12) noop (Scope4::EE10) O16
Ev6 : [] ++ O16 = O11
EvL1 : lookup Fields "null" falseVal
H8 : lookupScopes L EE12 (recVal Fields)
============================
 (evalExpr FE EE12 (null (name L)) falseVal EE12 [] /\ EE10 = EE12) /\ O11 = []
 < case Ev1.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 O9 O10 EE10 O11 O12 EE11 O13 O14 Fields
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE10 O9
EvW1 : O9 ++ O10 = O6
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
Ev6 : [] ++ [] = O11
EvL1 : lookup Fields "null" falseVal
H8 : lookupScopes L EE10 (recVal Fields)
============================
 (evalExpr FE EE10 (null (name L)) falseVal EE10 [] /\ EE10 = EE10) /\ O11 = []
 < case Ev6.

Subgoal 1.12.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 O9 O10 EE10 O12 EE11 O13 O14 Fields
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE10 O9
EvW1 : O9 ++ O10 = O6
Ev5 : [] ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
EvL1 : lookup Fields "null" falseVal
H8 : lookupScopes L EE10 (recVal Fields)
============================
 (evalExpr FE EE10 (null (name L)) falseVal EE10 [] /\ EE10 = EE10) /\ [] = []
 < search.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 EE10 O11 O12 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE10 O11
Ev5 : O11 ++ O12 = O10
EvA : evalStmt FE EE10 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
EvNL : (evalExpr FE EE8 (null (name L)) falseVal EE8 [] /\ EE10 = EE8) /\
       O11 = []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvNL: case EvNL.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 O6 V2 EE9 Scope3 EE8 O9 O10 O12 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
Ev4 : [] ++ O6 = O4
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O6
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
Ev5 : [] ++ O12 = O10
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Ev4.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 O12 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
Ev5 : [] ++ O12 = O10
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O12
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Ev5.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < ENI: apply exprNames_relatedCtxs to _ _ _ _ _ SN1 with
          CtxB = []::Ctx'.

Subgoal 1.13:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
============================
 forall X, mems X ([]::Ctx') -> mems X Ctx'
 < intros M.

Subgoal 1.13:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
M : mems X ([]::Ctx')
============================
 mems X Ctx'
 < M: case M.

Subgoal 1.13.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
M : mem X []
============================
 mems X Ctx'
 < case M.

Subgoal 1.13.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
M : mems X Ctx'
============================
 mems X Ctx'
 < search.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply ctx_names_add_scope to Ctxs.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < IsEE2+: apply evalExpr_isCtx to _ _ _ EvI.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2)
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < IsEE2: case IsEE2+.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ctxs': apply evalExpr_ctx_names to _ _ _ _ _ ENI EvI.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : ctx_names (Scope1::EE2) ([]::Ctx')
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Ctxs': case Ctxs'.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) Scope1 -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1
Ctxs'2 : ctx_names EE2 Ctx'
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Eq: assert Scope1 = [].

Subgoal 1.14:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) Scope1 -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1
Ctxs'2 : ctx_names EE2 Ctx'
============================
 Scope1 = []
 < Is: case IsEE2.

Subgoal 1.14.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
============================
 [] = []
 < search.

Subgoal 1.14.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 T H
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ((H::T)::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::(H::T))::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) (H::T) -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) (H::T)
Ctxs'2 : ctx_names EE2 Ctx'
Is : is_pair is_string is_value H
Is1 : is_list (is_pair is_string is_value) T
============================
 H::T = []
 < case Is.

Subgoal 1.14.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 T B A
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (((A, B)::T)::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::((A, B)::T))::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) ((A, B)::T) -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) ((A, B)::T)
Ctxs'2 : ctx_names EE2 Ctx'
Is1 : is_list (is_pair is_string is_value) T
H9 : is_string A
H10 : is_value B
============================
 (A, B)::T = []
 < M: apply Ctxs' to _ with
        K = A I = B.

Subgoal 1.14.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 T B A
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (((A, B)::T)::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::((A, B)::T))::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) ((A, B)::T) -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) ((A, B)::T)
Ctxs'2 : ctx_names EE2 Ctx'
Is1 : is_list (is_pair is_string is_value) T
H9 : is_string A
H10 : is_value B
M : mem A []
============================
 (A, B)::T = []
 < case M.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 Scope1 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V (Scope1::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE (((SaveI, V)::Scope1)::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) Scope1 -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1
Ctxs'2 : ctx_names EE2 Ctx'
Eq : Scope1 = []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ EvI.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE N
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < rename N to Len.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NNS: assert newNameScopes [[]] Len ([]::EE) EE.

Subgoal 1.15:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 newNameScopes [[]] Len ([]::EE) EE
 < unfold .

Subgoal 1.15:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 exists N SNames BNames,
   ((((length EE Len /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   Names.

Subgoal 1.15:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 ((((length EE Len /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE Names) /\
 (forall X, mem X [] -> mem X Names -> false)
 < split.

Subgoal 1.15.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 length EE Len
 < search.

Subgoal 1.15.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 1.15.3:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 1.15.4:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 names [[]] []
 < search.

Subgoal 1.15.5:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 names EE Names
 < search.

Subgoal 1.15.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
============================
 forall X, mem X [] -> mem X Names -> false
 < intros M.

Subgoal 1.15.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
M : mem X []
H10 : mem X Names
============================
 false
 < case M.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvI': apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ SN1 EvI NNS.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < LenEE2: apply evalExpr_keep_scopes to _ _ _ EvI' LenEE.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvI EvI' NNS.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE_B'
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Eq: assert EE_B' = EE2.

Subgoal 1.16:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE_B'
============================
 EE_B' = EE2
 < NNS': case NNS'.

Subgoal 1.16.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' N SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
NNS' : length EE_B' Len
NNS'1 : drop N ([]::EE2) EE_B'
NNS'2 : take N ([]::EE2) [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_B' = EE2
 < Take: case NNS'2.

Subgoal 1.16.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' N SNames BNames N2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
NNS' : length EE_B' Len
NNS'1 : drop N ([]::EE2) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N
Take1 : take N2 EE2 []
============================
 EE_B' = EE2
 < Take: case Take1.

Subgoal 1.16.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' N SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
NNS' : length EE_B' Len
NNS'1 : drop N ([]::EE2) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N
============================
 EE_B' = EE2
 < compute Take.

Subgoal 1.16.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
NNS' : length EE_B' Len
NNS'1 : drop 1 ([]::EE2) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 EE_B' = EE2
 < apply drop_one to NNS'1.

Subgoal 1.16.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B' SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE_B') O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE_B') E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
NNS' : length EE_B' Len
NNS'1 : drop 1 ([]::EE_B') EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 EE_B' = EE_B'
 < search.

Subgoal 1.16.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V ([]::BR) O2
LenEE2 : length ([]::BR) Len
NNS' : newNameScopes [[]] Len EE2 BR
============================
 []::BR = EE2
 < LenBR: case LenEE2.

Subgoal 1.16.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V ([]::BR) O2
NNS' : newNameScopes [[]] Len EE2 BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
============================
 []::BR = EE2
 < apply length_is to LenBR.

Subgoal 1.16.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V ([]::BR) O2
NNS' : newNameScopes [[]] Len EE2 BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
============================
 []::BR = EE2
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 1.16.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V ([]::BR) O2
NNS' : newNameScopes [[]] Len EE2 BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
L : N' < Len
============================
 []::BR = EE2
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 1.16.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len BR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V ([]::BR) O2
NNS' : newNameScopes [[]] Len EE2 BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
L : N' < Len
LEq : Len <= N'
============================
 []::BR = EE2
 < apply less_lesseq_flip_false to L LEq.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len EE_B'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE_B' O2
LenEE2 : length EE_B' Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE_B'
Eq : EE_B' = EE2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < clear Ctxs'
   Ctxs'1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Names2: apply names_exists to _ with
             L = EE2.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NNS'': assert newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2.

Subgoal 1.17:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
 < unfold .

Subgoal 1.17:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 exists N SNames BNames,
   ((((length EE2 Len /\ drop N ([(SaveI, V)]::EE2) EE2) /\
   take N ([(SaveI, V)]::EE2) [[(SaveI, V)]]) /\
   names [[(SaveI, V)]] SNames) /\
   names EE2 BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveI],
   N.

Subgoal 1.17:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 ((((length EE2 Len /\ drop 1 ([(SaveI, V)]::EE2) EE2) /\
 take 1 ([(SaveI, V)]::EE2) [[(SaveI, V)]]) /\
 names [[(SaveI, V)]] [SaveI]) /\
 names EE2 N) /\
 (forall X, mem X [SaveI] -> mem X N -> false)
 < split.

Subgoal 1.17.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 length EE2 Len
 < search.

Subgoal 1.17.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 drop 1 ([(SaveI, V)]::EE2) EE2
 < search.

Subgoal 1.17.3:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 take 1 ([(SaveI, V)]::EE2) [[(SaveI, V)]]
 < search.

Subgoal 1.17.4:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 names [[(SaveI, V)]] [SaveI]
 < search.

Subgoal 1.17.5:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 names EE2 N
 < search.

Subgoal 1.17.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
============================
 forall X, mem X [SaveI] -> mem X N -> false
 < intros M MN.

Subgoal 1.17.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
M : mem X [SaveI]
MN : mem X N
============================
 false
 < M: case M.

Subgoal 1.17.6.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
MN : mem SaveI N
============================
 false
 < NS: apply evalExpr_names_same to _ _ _ EvI.

Subgoal 1.17.6.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
MN : mem SaveI N
NS : names_same ([]::EE) ([]::EE2)
============================
 false
 < NS: case NS.

Subgoal 1.17.6.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
MN : mem SaveI N
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
============================
 false
 < apply names_same_symmetric to NS2.

Subgoal 1.17.6.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
MN : mem SaveI N
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H10 : names_same EE2 EE
============================
 false
 < apply names_same_names to _ Names2 Names MN.

Subgoal 1.17.6.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
MN : mem SaveI N
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H10 : names_same EE2 EE
H11 : mem SaveI Names
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 1.17.6.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N X
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
MN : mem X N
M : mem X []
============================
 false
 < case M.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvE': apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ _ EvE NNS''.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < LenEE5: apply evalExpr_keep_scopes to _ _ _ EvE' LenEE2.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NNS+: apply evalExpr_newNameScopes_ctx to _ _ _ _ EvE EvE' NNS''.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len (Scope2::EE5) EE_B'1
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Eq: assert Scope2 = [(SaveI, V)] /\
   EE_B'1 = EE5.

Subgoal 1.18:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len (Scope2::EE5) EE_B'1
============================
 Scope2 = [(SaveI, V)] /\ EE_B'1 = EE5
 < NNS+: case NNS+.

Subgoal 1.18.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 N1 SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
NNS+ : length EE_B'1 Len
NNS+1 : drop N1 (Scope2::EE5) EE_B'1
NNS+2 : take N1 (Scope2::EE5) [[(SaveI, V)]]
NNS+3 : names [[(SaveI, V)]] SNames
NNS+4 : names EE_B'1 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
============================
 Scope2 = [(SaveI, V)] /\ EE_B'1 = EE5
 < Take: case NNS+2.

Subgoal 1.18.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 N1 SNames BNames N2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
NNS+ : length EE_B'1 Len
NNS+1 : drop N1 ([(SaveI, V)]::EE5) EE_B'1
NNS+3 : names [[(SaveI, V)]] SNames
NNS+4 : names EE_B'1 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N2 = N1
Take1 : take N2 EE5 []
============================
 [(SaveI, V)] = [(SaveI, V)] /\ EE_B'1 = EE5
 < Take: case Take1.

Subgoal 1.18.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 N1 SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
NNS+ : length EE_B'1 Len
NNS+1 : drop N1 ([(SaveI, V)]::EE5) EE_B'1
NNS+3 : names [[(SaveI, V)]] SNames
NNS+4 : names EE_B'1 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 [(SaveI, V)] = [(SaveI, V)] /\ EE_B'1 = EE5
 < compute Take.

Subgoal 1.18.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
NNS+ : length EE_B'1 Len
NNS+1 : drop 1 ([(SaveI, V)]::EE5) EE_B'1
NNS+3 : names [[(SaveI, V)]] SNames
NNS+4 : names EE_B'1 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveI, V)] = [(SaveI, V)] /\ EE_B'1 = EE5
 < apply drop_one to NNS+1.

Subgoal 1.18.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1 SNames BNames
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE_B'1) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE_B'1) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE_B'1) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
NNS+ : length EE_B'1 Len
NNS+1 : drop 1 ([(SaveI, V)]::EE_B'1) EE_B'1
NNS+3 : names [[(SaveI, V)]] SNames
NNS+4 : names EE_B'1 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveI, V)] = [(SaveI, V)] /\ EE_B'1 = EE_B'1
 < search.

Subgoal 1.18.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1
LenEE5 : length (Scope2::BR) Len
NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR
============================
 Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
 < Len: case LenEE5.

Subgoal 1.18.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1
NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR
Len : length BR N'
Len1 : 1 + N' = Len
============================
 Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
 < apply length_is to Len.

Subgoal 1.18.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1
NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR
Len : length BR N'
Len1 : 1 + N' = Len
H10 : is_integer N'
============================
 Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
 < L: apply lt_plus_one to Len1 _.

Subgoal 1.18.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1
NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR
Len : length BR N'
Len1 : 1 + N' = Len
H10 : is_integer N'
L : N' < Len
============================
 Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
 < LEq: apply newNameScopes_length to NNS+ Len.

Subgoal 1.18.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N BR N'
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 (Scope2::BR) O1
NNS+ : newNameScopes [[(SaveI, V)]] Len EE5 BR
Len : length BR N'
Len1 : 1 + N' = Len
H10 : is_integer N'
L : N' < Len
LEq : Len <= N'
============================
 Scope2 = [(SaveI, V)] /\ Scope2::BR = EE5
 < apply less_lesseq_flip_false to L LEq.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 Scope2 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N EE_B'1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 (Scope2::EE5) O1
EvMI1 : replaceScopes SaveI V2 (((SaveE, V1)::Scope2)::EE5) (Scope3::EE9)
LI : lookupScopes SaveI (((SaveE, V1)::Scope2)::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE_B'1 O1
LenEE5 : length EE_B'1 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len (Scope2::EE5) EE_B'1
Eq : Scope2 = [(SaveI, V)] /\ EE_B'1 = EE5
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Eq: assert V2 = V.

Subgoal 1.19:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
============================
 V2 = V
 < L: case LI.

Subgoal 1.19.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
L : lookup [(SaveE, V1), (SaveI, V)] SaveI V2
============================
 V2 = V
 < L: case L.

Subgoal 1.19.1.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveI E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveI)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveI
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveI
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveI -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveI -> false
NEqEL : SaveI = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveI = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V2 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveI, V2), (SaveI, V)]::EE5) (Scope3::EE9)
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveI)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V2 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
============================
 V2 = V
 < apply NEqIE to _.

Subgoal 1.19.1.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
L : SaveE = SaveI -> false
L1 : lookup [(SaveI, V)] SaveI V2
============================
 V2 = V
 < L: case L1.

Subgoal 1.19.1.2.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V2 ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V2)]::EE2) E V1 ([(SaveI, V2)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V2)]::EE5) (Scope3::EE9)
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V2
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V2 EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V2)]] Len ([(SaveI, V2)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V2)]] Len ([(SaveI, V2)]::EE5) EE5
L : SaveE = SaveI -> false
============================
 V2 = V2
 < search.

Subgoal 1.19.1.2.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
L : SaveE = SaveI -> false
L1 : SaveI = SaveI -> false
L2 : lookup [] SaveI V2
============================
 V2 = V
 < apply L1 to _.

Subgoal 1.19.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
L : no_lookup [(SaveE, V1), (SaveI, V)] SaveI
L1 : lookupScopes SaveI EE5 V2
============================
 V2 = V
 < N: case L.

Subgoal 1.19.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
L1 : lookupScopes SaveI EE5 V2
N : SaveE = SaveI -> false
N1 : no_lookup [(SaveI, V)] SaveI
============================
 V2 = V
 < N: case N1.

Subgoal 1.19.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
L1 : lookupScopes SaveI EE5 V2
N : SaveE = SaveI -> false
N1 : SaveI = SaveI -> false
N2 : no_lookup [] SaveI
============================
 V2 = V
 < apply N1 to _.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 V2 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V2 ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V2
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
Eq : V2 = V
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Eq: assert Scope3::EE9 = [(SaveI, V), (SaveE, V1)]::EE5.

Subgoal 1.20:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
============================
 Scope3::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
 < RS: case EvMI1.

Subgoal 1.20.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 LRemain
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::LRemain))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE9 O1
LenEE5 : length EE9 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9
RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)]
RS1 : remove_all [(SaveE, V1), (SaveI, V)] SaveI LRemain
============================
 ((SaveI, V)::LRemain)::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
 < RA: case RS1.

Subgoal 1.20.1.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 LRemain
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveI E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveI)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveI
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveI
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveI -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveI -> false
NEqEL : SaveI = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveI = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1
LI : lookupScopes SaveI ([(SaveI, V1), (SaveI, V)]::EE9) V
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::LRemain))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveI)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE9 O1
LenEE5 : length EE9 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9
RS : mem (SaveI, I1) [(SaveI, V1), (SaveI, V)]
RA : remove_all [(SaveI, V)] SaveI LRemain
============================
 ((SaveI, V)::LRemain)::EE9 = [(SaveI, V), (SaveI, V1)]::EE9
 < apply NEqIE to _.

Subgoal 1.20.1.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 R
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::((SaveE, V1)::R)))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE9 O1
LenEE5 : length EE9 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9
RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)]
RA : SaveE = SaveI -> false
RA1 : remove_all [(SaveI, V)] SaveI R
============================
 ((SaveI, V)::((SaveE, V1)::R))::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
 < RA: case RA1.

Subgoal 1.20.1.2.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 R
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::((SaveE, V1)::R)))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE9 O1
LenEE5 : length EE9 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9
RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)]
RA : SaveE = SaveI -> false
RA1 : remove_all [] SaveI R
============================
 ((SaveI, V)::((SaveE, V1)::R))::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
 < case RA1.

Subgoal 1.20.1.2.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE9 O1
LenEE5 : length EE9 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9
RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)]
RA : SaveE = SaveI -> false
============================
 [(SaveI, V), (SaveE, V1)]::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
 < search.

Subgoal 1.20.1.2.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N I1 R1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE9) O1
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE9) V
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::((SaveI, V)::((SaveE, V1)::((SaveI, V)::R1))))::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE9 O1
LenEE5 : length EE9 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE9) EE9
RS : mem (SaveI, I1) [(SaveE, V1), (SaveI, V)]
RA : SaveE = SaveI -> false
RA1 : SaveI = SaveI -> false
RA2 : remove_all [] SaveI R1
============================
 ((SaveI, V)::((SaveE, V1)::((SaveI, V)::R1)))::EE9 = [(SaveI, V), (SaveE, V1)]::EE9
 < apply RA1 to _.

Subgoal 1.20.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveE, V1), (SaveI, V)]::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
RS : no_lookup [(SaveE, V1), (SaveI, V)] SaveI
RS1 : replaceScopes SaveI V EE5 EE9
============================
 [(SaveE, V1), (SaveI, V)]::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
 < N: case RS.

Subgoal 1.20.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveE, V1), (SaveI, V)]::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
RS1 : replaceScopes SaveI V EE5 EE9
N : SaveE = SaveI -> false
N1 : no_lookup [(SaveI, V)] SaveI
============================
 [(SaveE, V1), (SaveI, V)]::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
 < N: case N1.

Subgoal 1.20.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveE, V1), (SaveI, V)]::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
RS1 : replaceScopes SaveI V EE5 EE9
N : SaveE = SaveI -> false
N1 : SaveI = SaveI -> false
N2 : no_lookup [] SaveI
============================
 [(SaveE, V1), (SaveI, V)]::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
 < apply N1 to _.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE9 Scope3 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V ([(SaveE, V1), (SaveI, V)]::EE5) (Scope3::EE9)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V
EvW : evalStmt FE (((Hold, recVal [("null", trueVal)])::Scope3)::EE9) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
Eq : Scope3::EE9 = [(SaveI, V), (SaveE, V1)]::EE5
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvMI1 : replaceScopes SaveI V ([(SaveE, V1), (SaveI, V)]::EE5) ([(SaveI, V), (SaveE, V1)]::EE5)
LI : lookupScopes SaveI ([(SaveE, V1), (SaveI, V)]::EE5) V
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < clear LI
   EvMI1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ EvE'.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply evalExpr_isCtx to _ _ _ EvE'.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < Eq: assert O13 = [] /\
   (exists LV, lookupScopes L EE8 LV).

Subgoal 1.21:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
============================
 O13 = [] /\ (exists LV, lookupScopes L EE8 LV)
 < EvA: case EvA.

Subgoal 1.21:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N V4 EE12 FieldVals NewVals
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
EvA : evalExpr FE EE8 (name SaveE) V4 EE12 O13
EvA1 : lookupScopes L EE8 (recVal FieldVals)
EvA3 : updateRecFields ["head"] V4 FieldVals NewVals
EvA4 : replaceScopes L (recVal NewVals) EE12 EE11
============================
 O13 = [] /\ (exists LV, lookupScopes L EE8 LV)
 < case EvA.

Subgoal 1.21:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 O14 Len N V4 EE12 FieldVals NewVals
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE12 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : [] ++ O14 = O10
EvNL : evalExpr FE EE12 (null (name L)) falseVal EE12 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
EvA1 : lookupScopes L EE12 (recVal FieldVals)
EvA3 : updateRecFields ["head"] V4 FieldVals NewVals
EvA4 : replaceScopes L (recVal NewVals) EE12 EE11
H12 : lookupScopes SaveE EE12 V4
============================
 [] = [] /\ (exists LV, lookupScopes L EE12 LV)
 < search.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O13 O14 Len N
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 O13
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : O13 ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
Eq : O13 = [] /\ (exists LV, lookupScopes L EE8 LV)
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < LL: case Eq.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 O14 Len N LV
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O14
EvA2 : [] ++ O14 = O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case EvA2.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < LS: assert exists LV,
     lookupScopes L EE5 LV.

Subgoal 1.22:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
============================
 exists LV, lookupScopes L EE5 LV
 < NS: apply eval_while_names_same to _ _ _ _ EvW.

Subgoal 1.22.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5)
 < search 20.

Subgoal 1.22.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
============================
 is_stmt (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))
 < search 30.

Subgoal 1.22:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
NS : names_same ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) EE8
============================
 exists LV, lookupScopes L EE5 LV
 < NS: case NS.

Subgoal 1.22:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (B::BRest) LV
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
============================
 exists LV, lookupScopes L EE5 LV
 < Names5: apply names_exists to _ with
             L = EE5.

Subgoal 1.22:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (B::BRest) LV
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
============================
 exists LV, lookupScopes L EE5 LV
 < IsEE8: apply evalStmt_isCtx to _ _ _ EvW.

Subgoal 1.22.3:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (B::BRest) LV
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5)
 < search 20.

Subgoal 1.22.4:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (B::BRest) LV
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
============================
 is_stmt (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))))
 < search 30.

Subgoal 1.22:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (B::BRest) LV
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
============================
 exists LV, lookupScopes L EE5 LV
 < Names8: apply names_exists to IsEE8.

Subgoal 1.22:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (B::BRest) LV
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
============================
 exists LV, lookupScopes L EE5 LV
 < LL: case LL.

Subgoal 1.22.5:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B L LV
============================
 exists LV, lookupScopes L EE5 LV
 < ML: apply lookup_mem to LL.

Subgoal 1.22.5:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B L LV
ML : mem (L, LV) B
============================
 exists LV, lookupScopes L EE5 LV
 < M: apply NS1 to ML.

Subgoal 1.22.5:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 IA
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B L LV
ML : mem (L, LV) B
M : mem (L, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
============================
 exists LV, lookupScopes L EE5 LV
 < M: case M.

Subgoal 1.22.5.1:

Variables: Names FE EE EE' O Ctx' Hold Copy SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2
Pr : Names |{stmt}- listUpdate Hold I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (seq (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate Hold ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (Hold::Names) SaveI
Pr2 : fresh_name "Hold" (Hold::Names) Hold
Pr3 : fresh_name "E" (Hold::Names) SaveE
Pr4 : fresh_name "C" (Hold::Names) Copy
H1 : is_string Hold
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = Hold -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems Hold Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name Hold)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name Hold)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate Hold ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name Hold)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B Hold LV
ML : mem (Hold, LV) B
============================
 exists LV, lookupScopes Hold EE5 LV
 < apply NEqHL to _.

Subgoal 1.22.5.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 IA
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B L LV
ML : mem (L, LV) B
M : mem (L, IA) [(SaveI, V), (SaveE, V1)]
============================
 exists LV, lookupScopes L EE5 LV
 < M: case M.

Subgoal 1.22.5.2.1:

Variables: Names FE EE EE' O Ctx' Hold Copy SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2
Pr : Names |{stmt}- listUpdate SaveI I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (seq (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveI ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (SaveI::Names) SaveI
Pr2 : fresh_name "Hold" (SaveI::Names) Hold
Pr3 : fresh_name "E" (SaveI::Names) SaveE
Pr4 : fresh_name "C" (SaveI::Names) Copy
H1 : is_string SaveI
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveI -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveI -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveI -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems SaveI Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveI)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveI)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveI (tail (name SaveI)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name SaveI)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate SaveI ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveI)) (seq (assign SaveI (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name SaveI)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B SaveI LV
ML : mem (SaveI, LV) B
============================
 exists LV, lookupScopes SaveI EE5 LV
 < apply NEqIL to _.

Subgoal 1.22.5.2.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 IA
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B L LV
ML : mem (L, LV) B
M : mem (L, IA) [(SaveE, V1)]
============================
 exists LV, lookupScopes L EE5 LV
 < M: case M.

Subgoal 1.22.5.2.2.1:

Variables: Names FE EE EE' O Ctx' Hold Copy SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2
Pr : Names |{stmt}- listUpdate SaveE I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (seq (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate SaveE ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (SaveE::Names) SaveI
Pr2 : fresh_name "Hold" (SaveE::Names) Hold
Pr3 : fresh_name "E" (SaveE::Names) SaveE
Pr4 : fresh_name "C" (SaveE::Names) Copy
H1 : is_string SaveE
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveE -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveE -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveE -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = SaveE -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems SaveE Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name SaveE)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name SaveE)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign SaveE (tail (name SaveE)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name SaveE)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate SaveE ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name SaveE)) (seq (assign SaveE (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name SaveE)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B SaveE LV
ML : mem (SaveE, LV) B
============================
 exists LV, lookupScopes SaveE EE5 LV
 < apply NEqEL to _.

Subgoal 1.22.5.2.2.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 IA
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : lookup B L LV
ML : mem (L, LV) B
M : mem (L, IA) []
============================
 exists LV, lookupScopes L EE5 LV
 < case M.

Subgoal 1.22.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
Names8 : names (B::BRest) N2
LL : no_lookup B L
LL1 : lookupScopes L BRest LV
============================
 exists LV, lookupScopes L EE5 LV
 < Names: case Names8.

Subgoal 1.22.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
LL : no_lookup B L
LL1 : lookupScopes L BRest LV
Names1 : domain B NScope
Names3 : names BRest NRest
Names4 : NScope ++ NRest = N2
============================
 exists LV, lookupScopes L EE5 LV
 < ML: apply lookupScopes_names to LL1 Names3.

Subgoal 1.22.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
LL : no_lookup B L
LL1 : lookupScopes L BRest LV
Names1 : domain B NScope
Names3 : names BRest NRest
Names4 : NScope ++ NRest = N2
ML : mem L NRest
============================
 exists LV, lookupScopes L EE5 LV
 < apply names_same_symmetric to NS2.

Subgoal 1.22.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
LL : no_lookup B L
LL1 : lookupScopes L BRest LV
Names1 : domain B NScope
Names3 : names BRest NRest
Names4 : NScope ++ NRest = N2
ML : mem L NRest
H12 : names_same BRest EE5
============================
 exists LV, lookupScopes L EE5 LV
 < MN1: apply names_same_names to _ Names3 Names5 ML.

Subgoal 1.22.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
LL : no_lookup B L
LL1 : lookupScopes L BRest LV
Names1 : domain B NScope
Names3 : names BRest NRest
Names4 : NScope ++ NRest = N2
ML : mem L NRest
H12 : names_same BRest EE5
MN1 : mem L N1
============================
 exists LV, lookupScopes L EE5 LV
 < apply names_lookupScopes to _ Names5 MN1.

Subgoal 1.22.6:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 O9 O10 EE11 Len N LV BRest B N1 N2 NScope NRest V4
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (B::BRest) O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE (B::BRest) (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (B::BRest) []
EvA : evalStmt FE (B::BRest) (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (B::BRest) (null (name L)) falseVal (B::BRest) []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
NS : forall X IA,
       mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)] ->
       exists IB, mem (X, IB) B
NS1 : forall X IB,
        mem (X, IB) B -> exists IA,
          mem (X, IA) [(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]
NS2 : names_same EE5 BRest
Names5 : names EE5 N1
IsEE8 : is_list (is_list (is_pair is_string is_value)) (B::BRest)
LL : no_lookup B L
LL1 : lookupScopes L BRest LV
Names1 : domain B NScope
Names3 : names BRest NRest
Names4 : NScope ++ NRest = N2
ML : mem L NRest
H12 : names_same BRest EE5
MN1 : mem L N1
H13 : lookupScopes L EE5 V4
============================
 exists LV, lookupScopes L EE5 LV
 < search.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : exists LV, lookupScopes L EE5 LV
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < LS: case LS.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < ULI: apply proj_eval_listUpdate to NEqHI
          NEqHL
          NEqIE
          NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC IsFE _ _ LS EvW EvNL EvA.

Subgoal 1.23:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 V O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I V ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, V)]::EE2) E V1 ([(SaveI, V)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value V
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I V EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, V)]] Len ([(SaveI, V)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, V), (SaveE, V1)]::EE5)
 < search 20.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < GEq: apply updateListIndex_pos to ULI.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < LS': assert lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvAgain: apply proj_listUpdate_eval to ULI
              NEqHI
              NEqHL
              NEqIE NEqIL NEqHE NEqEL NEqCH NEqCL NEqIC NEqEC _ GEq IsFE _ _ LS'.

Subgoal 1.24:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5)
 < search 20.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvG: apply drop_proj_rel_evalStmt to EvAgain.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvG: case EvG.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 O15 O16
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O15
EvG1 : evalStmt FE EE12 (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O16
EvG2 : O15 ++ O16 = []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvG: case EvG1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 O15 O16 EE13 O17 O18
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O15
EvG2 : O15 ++ O16 = []
EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 O17
EvG3 : evalStmt FE EE13 (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O18
EvG4 : O17 ++ O18 = O16
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < EvG: case EvG3.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 O15 O16 EE13 O17 O18 EE14 O19 O20
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 O15
EvG2 : O15 ++ O16 = []
EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 O17
EvG4 : O17 ++ O18 = O16
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 O19
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O20
EvG6 : O19 ++ O20 = O18
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case EvG2.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 O17 O18 EE14 O19 O20
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 []
EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 O17
EvG4 : O17 ++ O18 = []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 O19
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O20
EvG6 : O19 ++ O20 = O18
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case EvG4.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 EE14 O19 O20
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 []
EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 O19
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') O20
EvG6 : O19 ++ O20 = []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case EvG6.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 EE14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 []
EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply evalStmt_unique to _ _ _ EvG EvW.

Subgoal 1.25:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 EE14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 []
EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5)
 < search 20.

Subgoal 1.26:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O9 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE12 EE13 EE14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 O9
EvW1 : O9 ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE12 []
EvG1 : evalStmt FE EE12 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
============================
 is_stmt (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))))
 < search 30.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 []
EvG1 : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NS: apply evalStmt_names_same to _ _ _ EvW.

Subgoal 1.27:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 []
EvG1 : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5)
 < search 20.

Subgoal 1.28:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 EE8 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE8 []
EvA : evalStmt FE EE8 (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE EE8 (null (name L)) falseVal EE8 []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L EE8 LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) EE8 []
EvG1 : evalStmt FE EE8 (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
============================
 is_stmt (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))))
 < search 30.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < IsEE''+: apply evalStmt_isCtx to _ _ _ EvW.

Subgoal 1.29:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5)
 < search 20.

Subgoal 1.30:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
============================
 is_stmt (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L))))))))
 < search 30.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply evalStmt_unique to _ _ _ EvG1 Ev.

Subgoal 1.31:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE13 EE14 Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) EE13 []
EvG3 : evalStmt FE EE13 (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
============================
 is_stmt (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop)
 < search 20.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE14 Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply evalStmt_unique to _ _ _ EvG3 EvA.

Subgoal 1.32:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs EE14 Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE14 []
EvG5 : evalStmt FE EE14 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
============================
 is_stmt (recUpdate L ["head"] (name SaveE))
 < search 10.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvG5 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < NS: apply evalStmt_names_same to _ _ _ EvA.

Subgoal 1.33:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 EE11 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE''
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvW2 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) EE11 []
EvG5 : evalStmt FE EE11 (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
============================
 is_stmt (recUpdate L ["head"] (name SaveE))
 < search 10.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < IsEE''1+: apply evalStmt_isCtx to _ _ _ EvA.

Subgoal 1.34:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
============================
 is_stmt (recUpdate L ["head"] (name SaveE))
 < search 10.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply evalStmt_unique to _ _ _ EvG5 EvW2.

Subgoal 1.35:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I Scope O2 O3 EE2 O1 O4 EE5 V1 O10 Len N LV LV1 I1 NewL G' LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ O10 = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) (Scope::EE') O10
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 G'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::G') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
============================
 is_stmt (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))
 < search 20.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 O1 O4 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ O4 = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvW1 : [] ++ [] = O4
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < case EvW1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 O1 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O1 ++ [] = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O1
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O1
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply append_nil_right to Ev3.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
Ev3 : O3 ++ [] = O3
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < clear Ev3.

Subgoal 1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvAgain3 : flipOnto (recVal [("null", trueVal)]) NewL LV2
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < FO: case EvAgain3.

Subgoal 1.36:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 LV2
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO : lookup [("null", trueVal)] "null" trueVal
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < exists EE'.

Subgoal 1.36:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 LV2
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO : lookup [("null", trueVal)] "null" trueVal
============================
 evalStmt FE EE (listUpdate L I E) EE' O /\ scopes_same EE' EE'
 < split.

Subgoal 1.36.1:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 LV2
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO : lookup [("null", trueVal)] "null" trueVal
============================
 evalStmt FE EE (listUpdate L I E) EE' O
 < search.

Subgoal 1.36.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 LV2
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO : lookup [("null", trueVal)] "null" trueVal
============================
 scopes_same EE' EE'
 < apply lookupScopes_is to _ LS.

Subgoal 1.36.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 LV2
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO : lookup [("null", trueVal)] "null" trueVal
H12 : is_value LV1
H13 : is_string L
============================
 scopes_same EE' EE'
 < apply updateListIndex_is to _ _ ULI.

Subgoal 1.36.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 LV2
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO : lookup [("null", trueVal)] "null" trueVal
H12 : is_value LV1
H13 : is_string L
H14 : is_value LV2
============================
 scopes_same EE' EE'
 < apply replaceScopes_is to _ _ EvAgain2.

Subgoal 1.36.2:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 LV2 HFs Scope' EE'' Scope'1 EE''1
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 LV2
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO : lookup [("null", trueVal)] "null" trueVal
H12 : is_value LV1
H13 : is_string L
H14 : is_value LV2
H15 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 scopes_same EE' EE'
 < backchain scopes_same_reflexive.

Subgoal 1.37:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1 Fields' T
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO : lookup [("null", trueVal)] "null" falseVal
FO1 : lookup [("null", trueVal)] "tail" T
FO2 : replaceRecVal "tail" NewL [("null", trueVal)] Fields'
FO3 : flipOnto T (recVal Fields') LV2
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < L: case FO.

Subgoal 1.37:

Variables: Names FE EE EE' O Ctx' Hold Copy L SaveE SaveI E I O2 O3 EE2 EE5 V1 Len N LV LV1 I1 NewL LV2 HFs Scope' EE'' Scope'1 EE''1 Fields' T
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))))))))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Pr4 : fresh_name "C" (L::Names) Copy
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
H6 : is_string Hold
H7 : is_string Copy
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
NEqCH : Copy = Hold -> false
NEqCL : Copy = L -> false
NEqIC : SaveI = Copy -> false
NEqEC : SaveE = Copy -> false
SN : mems L Ctx'
SN1 : exprNames Ctx' I []
SN2 : exprNames Ctx' E []
Ev2 : O2 ++ O3 = O
EvI : evalExpr FE ([]::EE) I (intVal I1) ([]::EE2) O2
EvE : evalExpr FE ([(SaveI, intVal I1)]::EE2) E V1 ([(SaveI, intVal I1)]::EE5) O3
EvW : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
Ev : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvA : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvW2 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvNL : evalExpr FE (Scope'::EE'') (null (name L)) falseVal (Scope'::EE'') []
ENI : exprNames ([]::Ctx') I []
H8 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs'2 : ctx_names EE2 Ctx'
H9 : is_value (intVal I1)
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : evalExpr FE EE I (intVal I1) EE2 O2
LenEE2 : length EE2 Len
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
Names2 : names EE2 N
NNS'' : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE2) EE2
EvE' : evalExpr FE EE2 E V1 EE5 O3
LenEE5 : length EE5 Len
NNS+ : newNameScopes [[(SaveI, intVal I1)]] Len ([(SaveI, intVal I1)]::EE5) EE5
H10 : is_value V1
H11 : is_list (is_list (is_pair is_string is_value)) EE5
LL : lookupScopes L (Scope'::EE'') LV
LS : lookupScopes L EE5 LV1
ULI : updateListIndex LV1 I1 V1 NewL
GEq : I1 >= 0
LS' : lookupScopes L ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) LV1
EvAgain : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
EvAgain1 : lookup HFs "null" trueVal
EvAgain2 : replaceScopes L LV2 EE5 EE'
EvG : evalStmt FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal I1), (SaveE, V1)]::EE5) (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (Scope'::EE'') []
EvG1 : evalStmt FE (Scope'::EE'') (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (Scope'::EE'') []
EvG3 : evalStmt FE (Scope'::EE'') (recUpdate L ["head"] (name SaveE)) (Scope'1::EE''1) []
EvG5 : evalStmt FE (Scope'1::EE''1) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V1)]::EE') []
NS : names_same EE5 EE''
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope'::EE'')
NS1 : names_same EE'' EE''1
IsEE''1+ : is_list (is_list (is_pair is_string is_value)) (Scope'1::EE''1)
FO1 : lookup [("null", trueVal)] "tail" T
FO2 : replaceRecVal "tail" NewL [("null", trueVal)] Fields'
FO3 : flipOnto T (recVal Fields') LV2
L : "null" = "null" -> false
L1 : lookup [] "null" falseVal
============================
 exists EE'', evalStmt FE EE (listUpdate L I E) EE'' O /\ scopes_same EE' EE''
 < apply L to _.

Subgoal 2:

Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listForeach X L Body) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O
Pr1 : fresh_name "L" (X::Names) SaveL
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < case IsS.

Subgoal 2:

Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listForeach X L Body) [] Ctx'
Ev : evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L Scope
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listForeach X L Body) [] Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalStmt FE ([]::EE) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) (Scope::EE') O
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L Scope EE3 O2 O3
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listForeach X L Body) [] Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev : evalStmt FE ([]::EE) (declare intTy SaveL L) EE3 O2
Ev1 : evalStmt FE EE3 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (listForeach X L Body) [] Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < SN: case SN.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V NL NB Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L NL
SN1 : stmtNames ([X]::Ctx') Body NB Ctx2
SN2 : NL ++ NB = []
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < case SN2.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < EN: apply exprNames_relatedCtxs to _ _ _ _ _ SN with
         CtxB = []::Ctx'.

Subgoal 2.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
============================
 forall X, mems X ([]::Ctx') -> mems X Ctx'
 < intros M.

Subgoal 2.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
M : mems X1 ([]::Ctx')
============================
 mems X1 Ctx'
 < M: case M.

Subgoal 2.1.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
M : mem X1 []
============================
 mems X1 Ctx'
 < case M.

Subgoal 2.1.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
M : mems X1 Ctx'
============================
 mems X1 Ctx'
 < search.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply ctx_names_add_scope to Ctxs.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Ctxs': apply evalExpr_ctx_names to _ _ _ _ _ EN Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
Ctxs' : ctx_names (Scope1::EE2) ([]::Ctx')
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < IsEE2+: apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
Ctxs' : ctx_names (Scope1::EE2) ([]::Ctx')
IsEE2+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE2)
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < IsEE2: case IsEE2+.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
Ctxs' : ctx_names (Scope1::EE2) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Ctxs': case Ctxs'.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) Scope1 -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1
Ctxs'2 : ctx_names EE2 Ctx'
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Eq: assert Scope1 = [].

Subgoal 2.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) Scope1 -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1
Ctxs'2 : ctx_names EE2 Ctx'
============================
 Scope1 = []
 < Is: case IsEE2.

Subgoal 2.2.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
============================
 [] = []
 < search.

Subgoal 2.2.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 T H
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::(H::T))::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ((H::T)::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) (H::T) -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) (H::T)
Ctxs'2 : ctx_names EE2 Ctx'
Is : is_pair is_string is_value H
Is1 : is_list (is_pair is_string is_value) T
============================
 H::T = []
 < case Is.

Subgoal 2.2.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 T B A
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::((A, B)::T))::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (((A, B)::T)::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) ((A, B)::T) -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) ((A, B)::T)
Ctxs'2 : ctx_names EE2 Ctx'
Is1 : is_list (is_pair is_string is_value) T
H5 : is_string A
H6 : is_value B
============================
 (A, B)::T = []
 < M: apply Ctxs' to _.

Subgoal 2.2.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 T B A
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::((A, B)::T))::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (((A, B)::T)::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) ((A, B)::T) -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) ((A, B)::T)
Ctxs'2 : ctx_names EE2 Ctx'
Is1 : is_list (is_pair is_string is_value) T
H5 : is_string A
H6 : is_value B
M : mem A []
============================
 (A, B)::T = []
 < case M.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 Scope1 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE (((SaveL, V)::Scope1)::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V (Scope1::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) Scope1
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) Scope1 -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) Scope1
Ctxs'2 : ctx_names EE2 Ctx'
Eq : Scope1 = []
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Names2: apply names_exists to IsEE1.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply names_is to _ Names2.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Fr: apply fresh_name_exists to _ _ with
         Base = "L" Names = X::N.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < NS: apply evalExpr_names_same to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : names_same ([]::EE) ([]::EE2)
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < NS: case NS.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply fresh_name_unique_mems to Fr Pr1 _ _.

Subgoal 2.3:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
============================
 forall X1, mem X1 (X::Names) -> mem X1 (X::N)
 < intros M.

Subgoal 2.3:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
M : mem X1 (X::Names)
============================
 mem X1 (X::N)
 < M: case M.

Subgoal 2.3.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
============================
 mem X (X::N)
 < search.

Subgoal 2.3.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
M : mem X1 Names
============================
 mem X1 (X::N)
 < apply names_same_names to NS2 Names Names2 M.

Subgoal 2.3.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
M : mem X1 Names
H7 : mem X1 N
============================
 mem X1 (X::N)
 < search.

Subgoal 2.4:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
============================
 forall X1, mem X1 (X::N) -> mem X1 (X::Names)
 < intros M.

Subgoal 2.4:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
M : mem X1 (X::N)
============================
 mem X1 (X::Names)
 < M: case M.

Subgoal 2.4.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
============================
 mem X (X::Names)
 < search.

Subgoal 2.4.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
M : mem X1 N
============================
 mem X1 (X::Names)
 < NS': apply names_same_symmetric to NS2.

Subgoal 2.4.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
M : mem X1 N
NS' : names_same EE2 EE
============================
 mem X1 (X::Names)
 < apply names_same_names to NS' Names2 Names M.

Subgoal 2.4.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N F X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) F
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
M : mem X1 N
NS' : names_same EE2 EE
H7 : mem X1 Names
============================
 mem X1 (X::Names)
 < search.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply while_to_iterateList to _ _ _ _ _ _ Names2 Fr _ SN1 Ev1.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Len: apply length_exists_list_pair_string_value to IsEE.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < NNS: assert newNameScopes [[]] N1 ([]::EE) EE.

Subgoal 2.5:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 newNameScopes [[]] N1 ([]::EE) EE
 < unfold .

Subgoal 2.5:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 exists N SNames BNames,
   ((((length EE N1 /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   Names.

Subgoal 2.5:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 ((((length EE N1 /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE Names) /\
 (forall X, mem X [] -> mem X Names -> false)
 < split.

Subgoal 2.5.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 length EE N1
 < search.

Subgoal 2.5.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 2.5.3:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 2.5.4:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 names [[]] []
 < search.

Subgoal 2.5.5:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 names EE Names
 < search.

Subgoal 2.5.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
============================
 forall X, mem X [] -> mem X Names -> false
 < intros M.

Subgoal 2.5.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
M : mem X1 []
H8 : mem X1 Names
============================
 false
 < case M.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Ev': apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ SN Ev NNS.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev Ev' NNS.

Subgoal 2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : newNameScopes [[]] N1 ([]::EE2) EE_B'
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < NNS': case NNS'.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' N2 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'1 : drop N2 ([]::EE2) EE_B'
NNS'2 : take N2 ([]::EE2) [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Take: case NNS'2.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' N2 SNames BNames N3
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'1 : drop N2 ([]::EE2) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N3 = N2
Take1 : take N3 EE2 []
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < case Take1.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' N2 SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'1 : drop N2 ([]::EE2) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N2
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < compute Take.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'1 : drop 1 ([]::EE2) EE_B'
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Drop: case NNS'1.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames N4
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N4 = 1
Drop1 : drop N4 EE2 EE_B'
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply drop_is_integer to Drop1.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames N4
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N4 = 1
Drop1 : drop N4 EE2 EE_B'
H8 : is_integer N4
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE2 EE_B'
H8 : is_integer 0
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < Eq: assert EE2 = EE_B'.

Subgoal 2.6.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE2 EE_B'
H8 : is_integer 0
============================
 EE2 = EE_B'
 < D: case Drop1.

Subgoal 2.6.1.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H8 : is_integer 0
============================
 EE_B' = EE_B'
 < search.

Subgoal 2.6.1.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames N5 L1 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1)
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names (X1::L1) Ctx'
H5 : is_value V
Names2 : names (X1::L1) N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE (X1::L1)
H7 : iterateList FE (X1::L1) V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H8 : is_integer 0
D : 1 + N5 = 0
D1 : drop N5 L1 EE_B'
============================
 X1::L1 = EE_B'
 < apply drop_is_integer to D1.

Subgoal 2.6.1.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames N5 L1 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1)
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names (X1::L1) Ctx'
H5 : is_value V
Names2 : names (X1::L1) N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE (X1::L1)
H7 : iterateList FE (X1::L1) V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H8 : is_integer 0
D : 1 + N5 = 0
D1 : drop N5 L1 EE_B'
H9 : is_integer N5
============================
 X1::L1 = EE_B'
 < P: assert 1 + -1 = 0.

Subgoal 2.6.1.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames N5 L1 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1)
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names (X1::L1) Ctx'
H5 : is_value V
Names2 : names (X1::L1) N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE (X1::L1)
H7 : iterateList FE (X1::L1) V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H8 : is_integer 0
D : 1 + N5 = 0
D1 : drop N5 L1 EE_B'
H9 : is_integer N5
P : 1 + -1 = 0
============================
 X1::L1 = EE_B'
 < apply plus_integer_unique_addend to _ _ _ P D.

Subgoal 2.6.1.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames L1 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1)
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names (X1::L1) Ctx'
H5 : is_value V
Names2 : names (X1::L1) N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE (X1::L1)
H7 : iterateList FE (X1::L1) V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H8 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L1 EE_B'
H9 : is_integer -1
P : 1 + -1 = 0
============================
 X1::L1 = EE_B'
 < GEq: apply drop_geq_0 to D1.

Subgoal 2.6.1.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames L1 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1)
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names (X1::L1) Ctx'
H5 : is_value V
Names2 : names (X1::L1) N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE (X1::L1)
H7 : iterateList FE (X1::L1) V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H8 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L1 EE_B'
H9 : is_integer -1
P : 1 + -1 = 0
GEq : -1 >= 0
============================
 X1::L1 = EE_B'
 < LEq: case GEq.

Subgoal 2.6.1.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames L1 X1
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::(X1::L1)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::(X1::L1)) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) (X1::L1)
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names (X1::L1) Ctx'
H5 : is_value V
Names2 : names (X1::L1) N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE (X1::L1)
H7 : iterateList FE (X1::L1) V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H8 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L1 EE_B'
H9 : is_integer -1
P : 1 + -1 = 0
LEq : 0 <= -1
============================
 X1::L1 = EE_B'
 < case LEq.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE2 EE_B'
H8 : is_integer 0
Eq : EE2 = EE_B'
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < case Eq.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE_B' EE_B'
H8 : is_integer 0
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < clear Take
   Drop
   Drop1.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H8 : is_integer 0
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < exists EE'.

Subgoal 2.6:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H8 : is_integer 0
============================
 evalStmt FE EE (listForeach X L Body) EE' O /\ scopes_same EE' EE'
 < split.

Subgoal 2.6.2:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H8 : is_integer 0
============================
 evalStmt FE EE (listForeach X L Body) EE' O
 < search.

Subgoal 2.6.3:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H8 : is_integer 0
============================
 scopes_same EE' EE'
 < apply fresh_name_is to _ Fr.

Subgoal 2.6.3:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H8 : is_integer 0
H9 : is_string SaveL
============================
 scopes_same EE' EE'
 < IsEE'+: apply evalStmt_isCtx to _ _ _ Ev1.

Subgoal 2.6.3.1:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H8 : is_integer 0
H9 : is_string SaveL
============================
 is_stmt (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))
 < search 20.

Subgoal 2.6.3:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H8 : is_integer 0
H9 : is_string SaveL
IsEE'+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE')
============================
 scopes_same EE' EE'
 < case IsEE'+.

Subgoal 2.6.3:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 V Ctx2 N N1 EE_B' SNames BNames
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE_B') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE_B') O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE_B'
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE_B' Ctx'
H5 : is_value V
Names2 : names EE_B' N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE_B'
H7 : iterateList FE EE_B' V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V EE_B' O2
NNS' : length EE_B' N1
NNS'3 : names [[]] SNames
NNS'4 : names EE_B' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
H8 : is_integer 0
H9 : is_string SaveL
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 scopes_same EE' EE'
 < backchain scopes_same_reflexive.

Subgoal 2.7:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V ([]::BR) O2
NNS' : newNameScopes [[]] N1 EE2 BR
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < NS': apply evalExpr_names_same to _ _ _ Ev'.

Subgoal 2.7:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V ([]::BR) O2
NNS' : newNameScopes [[]] N1 EE2 BR
NS' : names_same EE ([]::BR)
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < LenBR+: apply names_same_length to NS' Len.

Subgoal 2.7:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V ([]::BR) O2
NNS' : newNameScopes [[]] N1 EE2 BR
NS' : names_same EE ([]::BR)
LenBR+ : length ([]::BR) N1
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < LenBR: case LenBR+.

Subgoal 2.7:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR N'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V ([]::BR) O2
NNS' : newNameScopes [[]] N1 EE2 BR
NS' : names_same EE ([]::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = N1
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply length_is to LenBR.

Subgoal 2.7:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR N'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V ([]::BR) O2
NNS' : newNameScopes [[]] N1 EE2 BR
NS' : names_same EE ([]::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = N1
H8 : is_integer N'
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 2.7:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR N'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V ([]::BR) O2
NNS' : newNameScopes [[]] N1 EE2 BR
NS' : names_same EE ([]::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = N1
H8 : is_integer N'
L : N' < N1
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 2.7:

Variables: Names FE EE EE' O Ctx' Body SaveL X L Scope O2 O3 EE2 V Ctx2 N N1 BR N'
Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Pr1 : fresh_name "L" (X::Names) SaveL
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ev1 : evalStmt FE ([(SaveL, V)]::EE2) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
Ev : evalExpr FE ([]::EE) L V ([]::EE2) O2
SN : exprNames Ctx' L []
SN1 : stmtNames ([X]::Ctx') Body [] Ctx2
EN : exprNames ([]::Ctx') L []
H4 : ctx_names ([]::EE) ([]::Ctx')
IsEE2 : is_list (is_pair is_string is_value) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : forall K I, mem (K, I) [] -> mem K []
Ctxs'1 : forall K, mem K [] -> exists I, mem (K, I) []
Ctxs'2 : ctx_names EE2 Ctx'
H5 : is_value V
Names2 : names EE2 N
H6 : is_list is_string N
Fr : fresh_name "L" (X::N) SaveL
NS : forall X IA, mem (X, IA) [] -> exists IB, mem (X, IB) []
NS1 : forall X IB, mem (X, IB) [] -> exists IA, mem (X, IA) []
NS2 : names_same EE EE2
H7 : iterateList FE EE2 V X Body EE' O3
Len : length EE N1
NNS : newNameScopes [[]] N1 ([]::EE) EE
Ev' : evalExpr FE EE L V ([]::BR) O2
NNS' : newNameScopes [[]] N1 EE2 BR
NS' : names_same EE ([]::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = N1
H8 : is_integer N'
L : N' < N1
LEq : N1 <= N'
============================
 exists EE'',
   evalStmt FE EE (listForeach X L Body) EE'' O /\ scopes_same EE' EE''
 < apply less_lesseq_flip_false to L LEq.

Proof completed.
 < Prove_Ext_Ind exactEval:host:evalExpr,
   exactEval:host:evalArgs,
   exactEval:host:evalRecFields,
   exactEval:host:evalStmt
   with forall FE EE V X Body EE' O, iterateList FE EE V X Body EE' O with
            IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE, IsEE : is_list (is_list (is_pair is_string is_value)) EE, IsV : is_value V, IsX : is_string X, IsBody : is_stmt Body.

Subgoal 1.27:

Variables: FE EE' Ty
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] 1 @@
Acc : acc 1 @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (nil Ty)
============================
 <evalExpr {P}> FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' []
 < apply names_exists to IsEE.

Subgoal 1.27:

Variables: FE EE' Ty N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] 1 @@
Acc : acc 1 @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsE : is_expr (nil Ty)
H1 : names EE' N1
============================
 <evalExpr {P}> FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' []
 < search.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (cons E1 E2)
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply names_exists to IsEE.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (cons E1 E2)
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply ext_size_is_int_evalExpr to R3.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (cons E1 E2)
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply ext_size_is_int_evalExpr to R4.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (cons E1 E2)
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < case IsE.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply plus_integer_is_integer to _ _ R2.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply ext_size_pos_evalExpr to R3.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply ext_size_pos_evalExpr to R4.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < Acc: case Acc.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < RP1: assert <evalExpr {P}> FE EE E1 V1 EE3 O2.

Subgoal 1.28.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < Or: apply lt_left to R2 _ _.

Subgoal 1.28.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
Or : N2 < N4 \/ N2 = N4
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < L': case Or.

Subgoal 1.28.1.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < L'': apply less_integer_transitive to L' L.

Subgoal 1.28.1.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
L'' : N2 < N
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < A2: apply Acc to _ L''.

Subgoal 1.28.1.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
L'' : N2 < N
A2 : acc N2 *
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < apply IH to R3 A2 _ _ _.

Subgoal 1.28.1.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
L'' : N2 < N
A2 : acc N2 *
H9 : <evalExpr {P}> FE EE E1 V1 EE3 O2
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < search.

Subgoal 1.28.1.2:

Variables: N FE EE EE' O N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N4 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N4 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N4
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N4
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < A2: apply Acc to _ L.

Subgoal 1.28.1.2:

Variables: N FE EE EE' O N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N4 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N4 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N4
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N4
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N4 *
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < apply IH to R3 A2 _ _ _.

Subgoal 1.28.1.2:

Variables: N FE EE EE' O N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N4 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N4 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N4
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N4
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N4 *
H9 : <evalExpr {P}> FE EE E1 V1 EE3 O2
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < search.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < RP2: assert <evalExpr {P}> FE EE3 E2 V2 EE' O3.

Subgoal 1.28.2:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < Ev1: apply drop_ext_size_evalExpr to R3.

Subgoal 1.28.2:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.28.2:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < Or: apply lt_right to R2 _ _ _.

Subgoal 1.28.2:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
Or : N3 < N4 \/ N3 = N4
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < L': case Or.

Subgoal 1.28.2.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
L' : N3 < N4
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < L'': apply less_integer_transitive to L' L.

Subgoal 1.28.2.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
L' : N3 < N4
L'' : N3 < N
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < A3: apply Acc to _ L''.

Subgoal 1.28.2.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
L' : N3 < N4
L'' : N3 < N
A3 : acc N3 *
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < apply IH to R4 A3 _ _ _.

Subgoal 1.28.2.1:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
L' : N3 < N4
L'' : N3 < N
A3 : acc N3 *
H10 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < search.

Subgoal 1.28.2.2:

Variables: N FE EE EE' O N2 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N4 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N4
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < A3: apply Acc to _ L.

Subgoal 1.28.2.2:

Variables: N FE EE EE' O N2 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N4 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N4
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N4 *
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < apply IH to R4 A3 _ _ _.

Subgoal 1.28.2.2:

Variables: N FE EE EE' O N2 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N4 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N4
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
Ev1 : evalExpr FE EE E1 V1 EE3 O2
H9 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N4 *
H10 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < search.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 <evalExpr {P}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < unfold .

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 exists Names E_P V_P EE_P O_P EE1 O1 O2,
   (<evalExpr {P}> FE EE E1 V1 EE1 O1 /\
   (<evalExpr {P}> FE EE1 E2 V2 EE' O2 /\ O1 ++ O2 = O)) /\
   (names EE Names /\
   (Names |{expr}- cons E1 E2 ~~> E_P /\ <evalExpr {P}> FE EE E_P V_P EE_P O_P))
 < exists N1,
   recBuild (consRecFieldExprs "null" exactEval:host:false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))),
   recVal [("null", falseVal), ("head", V1), ("tail", V2)],
   EE',
   O,
   EE3,
   O2,
   O3.

Subgoal 1.28:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 (<evalExpr {P}> FE EE E1 V1 EE3 O2 /\
 (<evalExpr {P}> FE EE3 E2 V2 EE' O3 /\ O2 ++ O3 = O)) /\
 (names EE N1 /\
 (N1 |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) /\
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O))
 < split.

Subgoal 1.28.3:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 <evalExpr {P}> FE EE E1 V1 EE3 O2
 < search.

Subgoal 1.28.4:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 <evalExpr {P}> FE EE3 E2 V2 EE' O3
 < search.

Subgoal 1.28.5:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 O2 ++ O3 = O
 < search.

Subgoal 1.28.6:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 names EE N1
 < search.

Subgoal 1.28.7:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 N1 |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
 < search.

Subgoal 1.28.8:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
============================
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < Ev1: apply drop_ext_size_evalExpr to R3.

Subgoal 1.28.8:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
Ev1 : evalExpr FE EE E1 V1 EE3 O2
============================
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < Ev2: apply drop_ext_size_evalExpr to R4.

Subgoal 1.28.8:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
Ev1 : evalExpr FE EE E1 V1 EE3 O2
Ev2 : evalExpr FE EE3 E2 V2 EE' O3
============================
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.28.8:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
Ev1 : evalExpr FE EE E1 V1 EE3 O2
Ev2 : evalExpr FE EE3 E2 V2 EE' O3
H9 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < IsO2: apply evalExpr_isOutput to _ _ _ Ev1.

Subgoal 1.28.8:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
Ev1 : evalExpr FE EE E1 V1 EE3 O2
Ev2 : evalExpr FE EE3 E2 V2 EE' O3
H9 : is_list (is_list (is_pair is_string is_value)) EE3
IsO2 : is_list is_value O2
============================
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < IsO3: apply evalExpr_isOutput to _ _ _ Ev2.

Subgoal 1.28.8:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
Ev1 : evalExpr FE EE E1 V1 EE3 O2
Ev2 : evalExpr FE EE3 E2 V2 EE' O3
H9 : is_list (is_list (is_pair is_string is_value)) EE3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
============================
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply is_list_values_append_nil to IsO2.

Subgoal 1.28.8:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
Ev1 : evalExpr FE EE E1 V1 EE3 O2
Ev2 : evalExpr FE EE3 E2 V2 EE' O3
H9 : is_list (is_list (is_pair is_string is_value)) EE3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H10 : O2 ++ [] = O2
============================
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < apply is_list_values_append_nil to IsO3.

Subgoal 1.28.8:

Variables: N FE EE EE' O N2 N3 N4 EE3 O2 O3 V2 V1 E2 E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE E1 V1 EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 E2 V2 EE' O3 N3 **
R5 : O2 ++ O3 = O
H1 : names EE N1
H2 : is_integer N2
H3 : is_integer N3
H4 : is_expr E1
H5 : is_expr E2
H6 : is_integer N4
L : N4 < N
H7 : 0 <= N2
H8 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 EE3 O2
RP2 : <evalExpr {P}> FE EE3 E2 V2 EE' O3
Ev1 : evalExpr FE EE E1 V1 EE3 O2
Ev2 : evalExpr FE EE3 E2 V2 EE' O3
H9 : is_list (is_list (is_pair is_string is_value)) EE3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H10 : O2 ++ [] = O2
H11 : O3 ++ [] = O3
============================
 <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O
 < search.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (head E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < apply names_exists to IsEE.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (head E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (head E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (head E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < case IsE.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < Acc: case Acc.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < A: apply Acc to _ L.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < apply IH to R2 A _ _ _.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < Ev: apply drop_ext_size_evalExpr to R2.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < IsO: apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
IsO : is_list is_value O
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < apply is_list_values_append_nil to IsO.

Subgoal 1.29:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (head E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "head" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
IsO : is_list is_value O
H6 : O ++ [] = O
============================
 <evalExpr {P}> FE EE (head E1) V EE' O
 < search.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (tail E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < apply names_exists to IsEE.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (tail E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (tail E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (tail E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < case IsE.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < Acc: case Acc.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < A: apply Acc to _ L.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < apply IH to R2 A _ _ _.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < Ev: apply drop_ext_size_evalExpr to R2.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < IsO: apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
IsO : is_list is_value O
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < apply is_list_values_append_nil to IsO.

Subgoal 1.30:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (tail E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "tail" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
IsO : is_list is_value O
H6 : O ++ [] = O
============================
 <evalExpr {P}> FE EE (tail E1) V EE' O
 < search.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (null E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < apply names_exists to IsEE.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (null E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (null E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (null E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < case IsE.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < Acc: case Acc.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < A: apply Acc to _ L.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < apply IH to R2 A _ _ _.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < Ev: apply drop_ext_size_evalExpr to R2.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < IsO: apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
IsO : is_list is_value O
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < apply is_list_values_append_nil to IsO.

Subgoal 1.31:

Variables: N FE EE V EE' O N2 Fields E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (null E1) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 (recVal Fields) EE' O N2 **
R3 : lookup Fields "null" V
H1 : names EE N1
H2 : is_integer N2
H3 : 0 <= N2
H4 : is_expr E1
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 (recVal Fields) EE' O
Ev : evalExpr FE EE E1 (recVal Fields) EE' O
IsO : is_list is_value O
H6 : O ++ [] = O
============================
 <evalExpr {P}> FE EE (null E1) V EE' O
 < search.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (index L I)
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < case IsE.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev: apply drop_ext_size_evalExpr to R3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev1: apply drop_ext_size_evalExpr to R4.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < IsIdx+: apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
IsIdx+ : is_value (intVal Idx)
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < case IsIdx+.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Len: apply length_exists_list_pair_string_value to IsEE.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE N1
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < rename N1 to LengthEE.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Names: apply names_exists to IsEE.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < NNS_L: assert newNameScopes [[]] LengthEE ([]::EE) EE.

Subgoal 1.32.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 newNameScopes [[]] LengthEE ([]::EE) EE
 < unfold .

Subgoal 1.32.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 exists N SNames BNames,
   ((((length EE LengthEE /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   N1.

Subgoal 1.32.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 ((((length EE LengthEE /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE N1) /\
 (forall X, mem X [] -> mem X N1 -> false)
 < split.

Subgoal 1.32.1.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 length EE LengthEE
 < search.

Subgoal 1.32.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 1.32.1.3:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 1.32.1.4:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 names [[]] []
 < search.

Subgoal 1.32.1.5:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 names EE N1
 < search.

Subgoal 1.32.1.6:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
============================
 forall X, mem X [] -> mem X N1 -> false
 < intros M.

Subgoal 1.32.1.6:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
M : mem X []
H5 : mem X N1
============================
 false
 < case M.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_LES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R3 NNS_L.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_L: apply drop_ext_size_evalExpr to Ev_LES.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2
Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < NNS_L': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_L Ev NNS_L.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2
Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2
NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < LenEE3: apply evalExpr_keep_scopes to _ _ _ Ev Len.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2
Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2
NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3
LenEE3 : length EE3 LengthEE
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Eq: assert EE_A' = []::EE3.

Subgoal 1.32.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2
Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2
NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3
LenEE3 : length EE3 LengthEE
============================
 EE_A' = []::EE3
 < NNS': case NNS_L'.

Subgoal 1.32.2.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A' N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2
Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'1 : drop N5 EE_A' EE3
NNS'2 : take N5 EE_A' [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A' = []::EE3
 < Take: case NNS'2.

Subgoal 1.32.2.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 N5 SNames BNames N6 L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::L1) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::L1) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'1 : drop N5 ([]::L1) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N6 = N5
Take1 : take N6 L1 []
============================
 []::L1 = []::EE3
 < case Take1.

Subgoal 1.32.2.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 N5 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::L1) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::L1) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'1 : drop N5 ([]::L1) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N5
============================
 []::L1 = []::EE3
 < compute Take.

Subgoal 1.32.2.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::L1) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::L1) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'1 : drop 1 ([]::L1) EE3
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::L1 = []::EE3
 < Drop: case NNS'1.

Subgoal 1.32.2.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames L1 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::L1) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::L1) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N7 = 1
Drop1 : drop N7 L1 EE3
============================
 []::L1 = []::EE3
 < Drop': case Drop1.

Subgoal 1.32.2.1.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 []::EE3 = []::EE3
 < search.

Subgoal 1.32.2.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N7 = 1
Drop' : 1 + N8 = N7
Drop'1 : drop N8 L2 EE3
============================
 []::(X::L2) = []::EE3
 < G: apply drop_geq_0 to Drop'1.

Subgoal 1.32.2.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N7 = 1
Drop' : 1 + N8 = N7
Drop'1 : drop N8 L2 EE3
G : N8 >= 0
============================
 []::(X::L2) = []::EE3
 < P: assert 1 + -1 = 0.

Subgoal 1.32.2.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N7 = 1
Drop' : 1 + N8 = N7
Drop'1 : drop N8 L2 EE3
G : N8 >= 0
P : 1 + -1 = 0
============================
 []::(X::L2) = []::EE3
 < apply drop_is_integer to Drop'1.

Subgoal 1.32.2.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N7 = 1
Drop' : 1 + N8 = N7
Drop'1 : drop N8 L2 EE3
G : N8 >= 0
P : 1 + -1 = 0
H5 : is_integer N8
============================
 []::(X::L2) = []::EE3
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 1.32.2.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N7 N8 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N7 = 1
Drop' : 1 + N8 = N7
Drop'1 : drop N8 L2 EE3
G : N8 >= 0
P : 1 + -1 = 0
H5 : is_integer N8
H6 : is_integer N7
============================
 []::(X::L2) = []::EE3
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 1.32.2.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames N8 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N8 = 0
Drop'1 : drop N8 L2 EE3
G : N8 >= 0
P : 1 + -1 = 0
H5 : is_integer N8
H6 : is_integer 0
============================
 []::(X::L2) = []::EE3
 < apply plus_integer_unique_addend to _ _ _ Drop' P.

Subgoal 1.32.2.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L2 EE3
G : -1 >= 0
P : 1 + -1 = 0
H5 : is_integer -1
H6 : is_integer 0
============================
 []::(X::L2) = []::EE3
 < L: case G.

Subgoal 1.32.2.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SNames BNames L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X::L2)) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::(X::L2)) O2
LenEE3 : length EE3 LengthEE
NNS' : length EE3 LengthEE
NNS'3 : names [[]] SNames
NNS'4 : names EE3 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L2 EE3
P : 1 + -1 = 0
H5 : is_integer -1
H6 : is_integer 0
L : 0 <= -1
============================
 []::(X::L2) = []::EE3
 < case L.

Subgoal 1.32.2.2:

Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 **
R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2
LenEE3 : length (S::BR) LengthEE
NNS' : newNameScopes [[]] LengthEE AR BR
============================
 S::AR = []::(S::BR)
 < LenBR: case LenEE3.

Subgoal 1.32.2.2:

Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 **
R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2
NNS' : newNameScopes [[]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
============================
 S::AR = []::(S::BR)
 < apply length_is to LenBR.

Subgoal 1.32.2.2:

Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 **
R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2
NNS' : newNameScopes [[]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H5 : is_integer N'
============================
 S::AR = []::(S::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 1.32.2.2:

Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 **
R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2
NNS' : newNameScopes [[]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H5 : is_integer N'
LEq : LengthEE <= N'
============================
 S::AR = []::(S::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 1.32.2.2:

Variables: N FE EE V EE' O N2 N3 N4 LV O2 Idx O3 I L LengthEE N1 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S::BR) O2 N2 **
R4 : <evalExpr {ES}> FE (S::BR) I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV (S::BR) O2
Ev1 : evalExpr FE (S::BR) I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) (S::BR)
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV (S::AR) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV (S::AR) O2
NNS' : newNameScopes [[]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H5 : is_integer N'
LEq : LengthEE <= N'
L : N' < LengthEE
============================
 S::AR = []::(S::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV EE_A' O2 N2
Ev_L : evalExpr FE ([]::EE) L LV EE_A' O2
NNS_L' : newNameScopes [[]] LengthEE EE_A' EE3
LenEE3 : length EE3 LengthEE
Eq : EE_A' = []::EE3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < case Eq.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < IsNames: apply names_is to _ Names.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < FrL: apply fresh_name_exists to _ IsNames with
          Base = "L".

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 F
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < FrI: apply fresh_name_exists to _ IsNames with
          Base = "I".

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 F F1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 F
FrI : fresh_name "I" N1 F1
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < rename F to SaveL.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL F1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 F1
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < rename F1 to SaveI.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_DL: assert <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < IsEE3: apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply fresh_name_is to _ FrL.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply fresh_name_is to _ FrI.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < NamesEE3: apply names_exists to IsEE3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < NNS_I: assert newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3.

Subgoal 1.32.3:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
 < unfold .

Subgoal 1.32.3:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 exists N SNames BNames,
   ((((length EE3 LengthEE /\ drop N ([(SaveL, LV)]::EE3) EE3) /\
   take N ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\
   names [[(SaveL, LV)]] SNames) /\
   names EE3 BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveL],
   N5.

Subgoal 1.32.3:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 ((((length EE3 LengthEE /\ drop 1 ([(SaveL, LV)]::EE3) EE3) /\
 take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\
 names [[(SaveL, LV)]] [SaveL]) /\
 names EE3 N5) /\
 (forall X, mem X [SaveL] -> mem X N5 -> false)
 < split.

Subgoal 1.32.3.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 length EE3 LengthEE
 < search.

Subgoal 1.32.3.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 drop 1 ([(SaveL, LV)]::EE3) EE3
 < search.

Subgoal 1.32.3.3:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]
 < search.

Subgoal 1.32.3.4:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 names [[(SaveL, LV)]] [SaveL]
 < search.

Subgoal 1.32.3.5:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 names EE3 N5
 < search.

Subgoal 1.32.3.6:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
============================
 forall X, mem X [SaveL] -> mem X N5 -> false
 < intros ML MN.

Subgoal 1.32.3.6:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
ML : mem X [SaveL]
MN : mem X N5
============================
 false
 < ML: case ML.

Subgoal 1.32.3.6.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
MN : mem SaveL N5
============================
 false
 < NS: apply evalExpr_names_same to _ _ _ Ev.

Subgoal 1.32.3.6.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
MN : mem SaveL N5
NS : names_same EE EE3
============================
 false
 < NS': apply names_same_symmetric to NS.

Subgoal 1.32.3.6.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
MN : mem SaveL N5
NS : names_same EE EE3
NS' : names_same EE3 EE
============================
 false
 < MNames: apply names_same_names to _ NamesEE3 Names MN.

Subgoal 1.32.3.6.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
MN : mem SaveL N5
NS : names_same EE EE3
NS' : names_same EE3 EE
MNames : mem SaveL N1
============================
 false
 < apply fresh_name_not_mem to FrL MNames.

Subgoal 1.32.3.6.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
MN : mem X N5
ML : mem X []
============================
 false
 < case ML.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_IES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R4 NNS_I.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_I: apply drop_ext_size_evalExpr to Ev_IES.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < NNS_If: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_I Ev1 NNS_I.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE'
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < LenEE': apply evalExpr_keep_scopes to _ _ _ Ev1 LenEE3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE'
LenEE' : length EE' LengthEE
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Eq: assert EE_A'1 = [(SaveL, LV)]::EE'.

Subgoal 1.32.4:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE'
LenEE' : length EE' LengthEE
============================
 EE_A'1 = [(SaveL, LV)]::EE'
 < NNS': case NNS_If.

Subgoal 1.32.4.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1 N6 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'1 : drop N6 EE_A'1 EE'
NNS'2 : take N6 EE_A'1 [[(SaveL, LV)]]
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A'1 = [(SaveL, LV)]::EE'
 < Take: case NNS'2.

Subgoal 1.32.4.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 N6 SNames BNames N7 L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'1 : drop N6 ([(SaveL, LV)]::L1) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N7 = N6
Take1 : take N7 L1 []
============================
 [(SaveL, LV)]::L1 = [(SaveL, LV)]::EE'
 < case Take1.

Subgoal 1.32.4.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 N6 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'1 : drop N6 ([(SaveL, LV)]::L1) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N6
============================
 [(SaveL, LV)]::L1 = [(SaveL, LV)]::EE'
 < compute Take.

Subgoal 1.32.4.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'1 : drop 1 ([(SaveL, LV)]::L1) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveL, LV)]::L1 = [(SaveL, LV)]::EE'
 < Drop: case NNS'1.

Subgoal 1.32.4.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames L1 N8
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::L1) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N8 = 1
Drop1 : drop N8 L1 EE'
============================
 [(SaveL, LV)]::L1 = [(SaveL, LV)]::EE'
 < Drop': case Drop1.

Subgoal 1.32.4.1.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 [(SaveL, LV)]::EE' = [(SaveL, LV)]::EE'
 < search.

Subgoal 1.32.4.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N8 = 1
Drop' : 1 + N9 = N8
Drop'1 : drop N9 L2 EE'
============================
 [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
 < G: apply drop_geq_0 to Drop'1.

Subgoal 1.32.4.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N8 = 1
Drop' : 1 + N9 = N8
Drop'1 : drop N9 L2 EE'
G : N9 >= 0
============================
 [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
 < P: assert 1 + -1 = 0.

Subgoal 1.32.4.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N8 = 1
Drop' : 1 + N9 = N8
Drop'1 : drop N9 L2 EE'
G : N9 >= 0
P : 1 + -1 = 0
============================
 [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
 < apply drop_is_integer to Drop'1.

Subgoal 1.32.4.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N8 = 1
Drop' : 1 + N9 = N8
Drop'1 : drop N9 L2 EE'
G : N9 >= 0
P : 1 + -1 = 0
H8 : is_integer N9
============================
 [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 1.32.4.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N8 N9 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N8 = 1
Drop' : 1 + N9 = N8
Drop'1 : drop N9 L2 EE'
G : N9 >= 0
P : 1 + -1 = 0
H8 : is_integer N9
H9 : is_integer N8
============================
 [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 1.32.4.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames N9 L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N9 = 0
Drop'1 : drop N9 L2 EE'
G : N9 >= 0
P : 1 + -1 = 0
H8 : is_integer N9
H9 : is_integer 0
============================
 [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
 < apply plus_integer_unique_addend to _ _ _ Drop' P.

Subgoal 1.32.4.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L2 EE'
G : -1 >= 0
P : 1 + -1 = 0
H8 : is_integer -1
H9 : is_integer 0
============================
 [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
 < L: case G.

Subgoal 1.32.4.1.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 SNames BNames L2 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::(X::L2)) O3
LenEE' : length EE' LengthEE
NNS' : length EE' LengthEE
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L2 EE'
P : 1 + -1 = 0
H8 : is_integer -1
H9 : is_integer 0
L : 0 <= -1
============================
 [(SaveL, LV)]::(X::L2) = [(SaveL, LV)]::EE'
 < case L.

Subgoal 1.32.4.2:

Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3
LenEE' : length (S::BR) LengthEE
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < LenBR: case LenEE'.

Subgoal 1.32.4.2:

Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < apply length_is to LenBR.

Subgoal 1.32.4.2:

Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H8 : is_integer N'
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 1.32.4.2:

Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H8 : is_integer N'
LEq : LengthEE <= N'
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 1.32.4.2:

Variables: N FE EE V O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) (S::BR) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) (S::BR) O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) (S::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] LengthEE AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = LengthEE
H8 : is_integer N'
LEq : LengthEE <= N'
L : N' < LengthEE
============================
 S::AR = [(SaveL, LV)]::(S::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) EE_A'1 O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE EE_A'1 EE'
LenEE' : length EE' LengthEE
Eq : EE_A'1 = [(SaveL, LV)]::EE'
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < case Eq.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_DI: assert <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < GEq: apply listIndex_geq_0 to _ R5.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
GEq : Idx >= 0
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < case GEq.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_C: assert <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < EvIf: assert <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < NEq: assert SaveL = SaveI -> false.

Subgoal 1.32.5:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
============================
 SaveL = SaveI -> false
 < intros E.

Subgoal 1.32.5:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
E : SaveL = SaveI
============================
 false
 < case E.

Subgoal 1.32.5:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveI
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveI L) ([(SaveI, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveI, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0
============================
 false
 < AppI: apply fresh_name_start to _ FrI.

Subgoal 1.32.5:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveI N5 S
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveI
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveI L) ([(SaveI, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveI, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0
AppI : "I" ++ S = SaveI
============================
 false
 < AppL: apply fresh_name_start to _ FrL.

Subgoal 1.32.5:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveI N5 S S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveI
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveI L) ([(SaveI, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveI
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveI, LV)]::EE3) I (intVal Idx) ([(SaveI, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveI, LV)]] LengthEE ([(SaveI, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveI, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveI, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveI, LV)]::EE') [] 0
AppI : "I" ++ S = SaveI
AppL : "L" ++ S1 = SaveI
============================
 false
 < case AppI.

Subgoal 1.32.5:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 N5 S S1 L3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 ("I"::L3)
FrI : fresh_name "I" N1 ("I"::L3)
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy ("I"::L3) L) ([("I"::L3, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string ("I"::L3)
H7 : is_string ("I"::L3)
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[("I"::L3, LV)]] LengthEE ([("I"::L3, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([("I"::L3, LV)]::EE3) I (intVal Idx) ([("I"::L3, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([("I"::L3, LV)]::EE3) I (intVal Idx) ([("I"::L3, LV)]::EE') O3
NNS_If : newNameScopes [[("I"::L3, LV)]] LengthEE ([("I"::L3, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([("I"::L3, LV)]::EE3) (declare intTy ("I"::L3) I) ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') (greater (num 0) (name ("I"::L3))) falseVal ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') (ifThenElse (greater (num 0) (name ("I"::L3))) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([("I"::L3, intVal Idx), ("I"::L3, LV)]::EE') [] 0
AppL : "L" ++ S1 = "I"::L3
H9 : [] ++ S = L3
============================
 false
 < case AppL.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < EvWhile: apply index_to_while to R5 NEq _ with
              Ctx = EE' FE = FE.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_W: apply drop_ext_size_evalStmt to EvWhile.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < assert SaveI = SaveL -> false.

Subgoal 1.32.6:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 SaveI = SaveL -> false
 < intros E.

Subgoal 1.32.6:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
E : SaveI = SaveL
============================
 false
 < case E.

Subgoal 1.32.6:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveL
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveL
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveL I) ([(SaveL, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveL)) falseVal ([(SaveL, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveL)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveL, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveL -> false
EvWhile : <evalStmt {ES}> FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1))))) ([(SaveL, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveL, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveL) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveL (minus (name SaveL) (num 1))))) ([(SaveL, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 false
 < backchain NEq.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < assert lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields).

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Ev_RFA: assert <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply ext_size_is_int_evalExpr to R3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply ext_size_is_int_evalExpr to R4.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply ext_size_pos_evalExpr to R3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply ext_size_pos_evalExpr to R4.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply plus_integer_is_integer to _ _ R2.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < L4: apply lt_plus_one to R1 _.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < Acc: case Acc.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < L2: assert N2 < N.

Subgoal 1.32.7:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 N2 < N
 < Or: apply lt_left to R2 _ _.

Subgoal 1.32.7:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
Or : N2 < N4 \/ N2 = N4
============================
 N2 < N
 < C: case Or.

Subgoal 1.32.7.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
C : N2 < N4
============================
 N2 < N
 < apply less_integer_transitive to C L4.

Subgoal 1.32.7.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
C : N2 < N4
H16 : N2 < N
============================
 N2 < N
 < search.

Subgoal 1.32.7.2:

Variables: N FE EE V EE' O N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N4 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N4 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N4
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N4
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N4
H12 : is_integer N3
H13 : 0 <= N4
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 N4 < N
 < search.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < L3: assert N3 < N.

Subgoal 1.32.8:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
============================
 N3 < N
 < Or: apply lt_right to R2 _ _ _.

Subgoal 1.32.8:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
Or : N3 < N4 \/ N3 = N4
============================
 N3 < N
 < C: case Or.

Subgoal 1.32.8.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
C : N3 < N4
============================
 N3 < N
 < apply less_integer_transitive to C L4.

Subgoal 1.32.8.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
C : N3 < N4
H16 : N3 < N
============================
 N3 < N
 < search.

Subgoal 1.32.8.2:

Variables: N FE EE V EE' O N2 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N4 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N4
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N4
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N4
H13 : 0 <= N2
H14 : 0 <= N4
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
============================
 N4 < N
 < search.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < A2: apply Acc to _ L2.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < A3: apply Acc to _ L3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply ext_size_pos_evalExpr to R.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < GEq4: apply greatereq_integer__add_positive to _ _ _ with
           N1 = N2 N2 = N3 Base = 0 Sum = N4.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < GEqN: apply greatereq_integer__add_positive to _ _ _ with
           N1 = 1 N2 = N4 Base = 0 Sum = N.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < OrN: apply greatereq_integer_greater_or_eq to GEqN.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < L0: assert 0 < N.

Subgoal 1.32.9:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
============================
 0 < N
 < C: case OrN.

Subgoal 1.32.9.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
C : N > 0
============================
 0 < N
 < case C.

Subgoal 1.32.9.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
H17 : 0 < N
============================
 0 < N
 < search.

Subgoal 1.32.9.2:

Variables: FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O 0 @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = 0
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < 0
Acc : forall M, 0 <= M -> M < 0 -> acc M *
L2 : N2 < 0
L3 : N3 < 0
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= 0
GEq4 : N4 >= 0
GEqN : 0 >= 0
============================
 0 < 0
 < P: assert 1 + -1 = 0.

Subgoal 1.32.9.2:

Variables: FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O 0 @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = 0
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < 0
Acc : forall M, 0 <= M -> M < 0 -> acc M *
L2 : N2 < 0
L3 : N3 < 0
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= 0
GEq4 : N4 >= 0
GEqN : 0 >= 0
P : 1 + -1 = 0
============================
 0 < 0
 < apply plus_integer_unique_addend to _ _ _ P R1.

Subgoal 1.32.9.2:

Variables: FE EE V EE' O N2 N3 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O 0 @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + -1 = 0
R2 : N2 + N3 = -1
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer -1
L4 : -1 < 0
Acc : forall M, 0 <= M -> M < 0 -> acc M *
L2 : N2 < 0
L3 : N3 < 0
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= 0
GEq4 : -1 >= 0
GEqN : 0 >= 0
P : 1 + -1 = 0
============================
 0 < 0
 < L: case GEq4.

Subgoal 1.32.9.2:

Variables: FE EE V EE' O N2 N3 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O 0 @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + -1 = 0
R2 : N2 + N3 = -1
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer -1
L4 : -1 < 0
Acc : forall M, 0 <= M -> M < 0 -> acc M *
L2 : N2 < 0
L3 : N3 < 0
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= 0
GEqN : 0 >= 0
P : 1 + -1 = 0
L : 0 <= -1
============================
 0 < 0
 < case L.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < A0: apply Acc to _ L0.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply IH3 to Ev_DL A2 _ _ _.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply IH3 to Ev_DI A3 _ _ _.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply IH3 to EvIf A0 _ _ _.

Subgoal 1.32.10:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_stmt (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop)
 < search 20.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply IH3 to EvWhile A0 _ _ _.

Subgoal 1.32.11:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
============================
 is_stmt (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))
 < search 20.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply IH to R3 A2 _ _ _.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply IH to R4 A3 _ _ _.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < IsO2: apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < IsO3: apply evalExpr_isOutput to _ _ _ Ev1.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < IsO: apply append_values_is to _ _ R6.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < apply is_list_values_append_nil to IsO3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 <evalExpr {P}> FE EE (index L I) V EE' O
 < unfold .

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 exists Names E_P V_P EE_P O_P LV EE1 O1 Idx O2,
   (<evalExpr {P}> FE EE L LV EE1 O1 /\
   (<evalExpr {P}> FE EE1 I (intVal Idx) EE' O2 /\
   (listIndex LV Idx V /\ O1 ++ O2 = O))) /\
   (names EE Names /\
   (Names |{expr}- index L I ~~> E_P /\ <evalExpr {P}> FE EE E_P V_P EE_P O_P))
 < exists N1,
   stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head"),
   V,
   EE',
   O,
   LV,
   EE3,
   O2,
   Idx,
   O3.

Subgoal 1.32:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 (<evalExpr {P}> FE EE L LV EE3 O2 /\
 (<evalExpr {P}> FE EE3 I (intVal Idx) EE' O3 /\
 (listIndex LV Idx V /\ O2 ++ O3 = O))) /\
 (names EE N1 /\
 (N1 |{expr}- index L I ~~> stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head") /\
 <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O))
 < split.

Subgoal 1.32.12:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 <evalExpr {P}> FE EE L LV EE3 O2
 < search.

Subgoal 1.32.13:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
 < search.

Subgoal 1.32.14:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 listIndex LV Idx V
 < search.

Subgoal 1.32.15:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 O2 ++ O3 = O
 < search.

Subgoal 1.32.16:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 names EE N1
 < search.

Subgoal 1.32.17:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 N1 |{expr}- index L I ~~> stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")
 < search.

Subgoal 1.32.18:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) (recFieldAccess (name SaveL) "head")) V EE' O
 < unfold .

Subgoal 1.32.18:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 exists EE1 O1 Scope O2,
   <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) EE1 O1 /\
   (<evalExpr {P}> FE EE1 (recFieldAccess (name SaveL) "head") V (Scope::EE') O2 /\
   O1 ++ O2 = O)
 < exists [(SaveI, intVal 0), (SaveL, recVal Fields)]::EE',
   O,
   [(SaveI, intVal 0), (SaveL, recVal Fields)],
   [].

Subgoal 1.32.18:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') O /\
 (<evalExpr {P}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] /\
 O ++ [] = O)
 < split.

Subgoal 1.32.18.1:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (seq (declare intTy SaveI I) (seq (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1)))))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') O
 < search.

Subgoal 1.32.18.2:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 <evalExpr {P}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
 < search.

Subgoal 1.32.18.3:

Variables: N FE EE V EE' O N2 N3 N4 LV EE3 O2 Idx O3 I L LengthEE N1 SaveL SaveI N5 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (index L I) V EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <evalExpr {ES}> FE EE3 I (intVal Idx) EE' O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ev : evalExpr FE EE L LV EE3 O2
Ev1 : evalExpr FE EE3 I (intVal Idx) EE' O3
H3 : is_list (is_list (is_pair is_string is_value)) EE3
H4 : is_integer Idx
Len : length EE LengthEE
Names : names EE N1
NNS_L : newNameScopes [[]] LengthEE ([]::EE) EE
Ev_LES : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
Ev_L : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS_L' : newNameScopes [[]] LengthEE ([]::EE3) EE3
LenEE3 : length EE3 LengthEE
IsNames : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrI : fresh_name "I" N1 SaveI
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 N2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : is_value LV
H6 : is_string SaveL
H7 : is_string SaveI
NamesEE3 : names EE3 N5
NNS_I : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE3) EE3
Ev_IES : <evalExpr {ES}> FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3 N3
Ev_I : evalExpr FE ([(SaveL, LV)]::EE3) I (intVal Idx) ([(SaveL, LV)]::EE') O3
NNS_If : newNameScopes [[(SaveL, LV)]] LengthEE ([(SaveL, LV)]::EE') EE'
LenEE' : length EE' LengthEE
Ev_DI : <evalStmt {ES}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3 N3
H8 : 0 <= Idx
Ev_C : <evalExpr {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (greater (num 0) (name SaveI)) falseVal ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
EvIf : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') [] 0
NEq : SaveL = SaveI -> false
EvWhile : <evalStmt {ES}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
EvWhile1 : lookup Fields "head" V
Ev_W : evalStmt FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H9 : SaveI = SaveL -> false
H10 : lookupScopes SaveL ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recVal Fields)
Ev_RFA : <evalExpr {ES}> FE ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') (recFieldAccess (name SaveL) "head") V ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') [] 0
H11 : is_integer N2
H12 : is_integer N3
H13 : 0 <= N2
H14 : 0 <= N3
H15 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H16 : 0 <= N
GEq4 : N4 >= 0
GEqN : N >= 0
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H17 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
H18 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (declare intTy SaveI I) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') O3
H19 : is_list (is_list (is_pair is_string is_value)) EE'
H20 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (ifThenElse (greater (num 0) (name SaveI)) (printVal (errorExpr (stringLit "Die") intTy)) noop) ([(SaveI, intVal Idx), (SaveL, LV)]::EE') []
H21 : <evalStmt {P}> FE ([(SaveI, intVal Idx), (SaveL, LV)]::EE') (while (greater (name SaveI) (num 0)) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign SaveI (minus (name SaveI) (num 1))))) ([(SaveI, intVal 0), (SaveL, recVal Fields)]::EE') []
H22 : <evalExpr {P}> FE EE L LV EE3 O2
H23 : <evalExpr {P}> FE EE3 I (intVal Idx) EE' O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
IsO : is_list is_value O
H24 : O3 ++ [] = O3
============================
 O ++ [] = O
 < backchain is_list_values_append_nil.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsE : is_expr (exactEval:list:length E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < case IsE.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Ev: apply drop_ext_size_evalExpr to R2.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Names: apply names_exists to IsEE.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < IsN1: apply names_is to _ Names.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < FrL: apply fresh_name_exists to _ IsN1 with
          Base = "L".

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 F
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < FrLen: apply fresh_name_exists to _ IsN1 with
            Base = "Len".

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 F F1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 F
FrLen : fresh_name "Len" N1 F1
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < rename F to SaveL.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL F1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 F1
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < rename F1 to Len.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < NEq: assert SaveL = Len -> false.

Subgoal 1.33.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
============================
 SaveL = Len -> false
 < intros E.

Subgoal 1.33.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
E : SaveL = Len
============================
 false
 < case E.

Subgoal 1.33.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 Len
FrLen : fresh_name "Len" N1 Len
============================
 false
 < AppLen: apply fresh_name_start to _ FrLen.

Subgoal 1.33.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 Len S
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 Len
FrLen : fresh_name "Len" N1 Len
AppLen : "Len" ++ S = Len
============================
 false
 < FrL: case FrL.

Subgoal 1.33.1.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 S
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 "L"
AppLen : "Len" ++ S = "L"
FrL : not_mem "L" N1
============================
 false
 < App: case AppLen.

Subgoal 1.33.1.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 S
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 "L"
FrL : not_mem "L" N1
App : "en" ++ S = []
============================
 false
 < case App.

Subgoal 1.33.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 Len S NewBase
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 Len
AppLen : "Len" ++ S = Len
FrL : mem "L" N1
FrL1 : "L" ++ "_" = NewBase
FrL2 : fresh_name NewBase N1 Len
============================
 false
 < AppL: case FrL1.

Subgoal 1.33.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 Len S L3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 Len
AppLen : "Len" ++ S = Len
FrL : mem "L" N1
FrL2 : fresh_name ("L"::L3) N1 Len
AppL : [] ++ "_" = L3
============================
 false
 < case AppL.

Subgoal 1.33.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 Len S
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 Len
AppLen : "Len" ++ S = Len
FrL : mem "L" N1
FrL2 : fresh_name "L_" N1 Len
============================
 false
 < AppL: apply fresh_name_start to _ FrL2.

Subgoal 1.33.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 Len S S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 Len
AppLen : "Len" ++ S = Len
FrL : mem "L" N1
FrL2 : fresh_name "L_" N1 Len
AppL : "L_" ++ S1 = Len
============================
 false
 < AppL: case AppL.

Subgoal 1.33.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 S S1 L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 ("L"::L1)
AppLen : "Len" ++ S = "L"::L1
FrL : mem "L" N1
FrL2 : fresh_name "L_" N1 ("L"::L1)
AppL : "_" ++ S1 = L1
============================
 false
 < case AppL.

Subgoal 1.33.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 S S1 L4
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 ("L"::("_"::L4))
AppLen : "Len" ++ S = "L"::("_"::L4)
FrL : mem "L" N1
FrL2 : fresh_name "L_" N1 ("L"::("_"::L4))
H2 : [] ++ S1 = L4
============================
 false
 < AppLen: case AppLen.

Subgoal 1.33.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 S S1 L4
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrLen : fresh_name "Len" N1 ("L"::("_"::L4))
FrL : mem "L" N1
FrL2 : fresh_name "L_" N1 ("L"::("_"::L4))
H2 : [] ++ S1 = L4
AppLen : "en" ++ S = "_"::L4
============================
 false
 < case AppLen.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < NNS: assert newNameScopes [[]] N3 ([]::EE) EE.

Subgoal 1.33.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 newNameScopes [[]] N3 ([]::EE) EE
 < unfold .

Subgoal 1.33.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 exists N SNames BNames,
   ((((length EE N3 /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   N1.

Subgoal 1.33.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 ((((length EE N3 /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE N1) /\
 (forall X, mem X [] -> mem X N1 -> false)
 < split.

Subgoal 1.33.2.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 length EE N3
 < search.

Subgoal 1.33.2.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 1.33.2.3:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 1.33.2.4:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 names [[]] []
 < search.

Subgoal 1.33.2.5:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 names EE N1
 < search.

Subgoal 1.33.2.6:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
============================
 forall X, mem X [] -> mem X N1 -> false
 < intros M.

Subgoal 1.33.2.6:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
M : mem X []
H2 : mem X N1
============================
 false
 < case M.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Ev_L_ES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R2 NNS.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Ev_L: apply drop_ext_size_evalExpr to Ev_L_ES.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < NNS_L: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev_L Ev NNS.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
NNS_L : newNameScopes [[]] N3 EE_A' EE'
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < LenEE': apply evalExpr_keep_scopes to _ _ _ Ev LenEE.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
NNS_L : newNameScopes [[]] N3 EE_A' EE'
LenEE' : length EE' N3
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Eq: assert EE_A' = []::EE'.

Subgoal 1.33.3:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
NNS_L : newNameScopes [[]] N3 EE_A' EE'
LenEE' : length EE' N3
============================
 EE_A' = []::EE'
 < NNS': case NNS_L.

Subgoal 1.33.3.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A' N4 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'1 : drop N4 EE_A' EE'
NNS'2 : take N4 EE_A' [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A' = []::EE'
 < Take: case NNS'2.

Subgoal 1.33.3.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 N4 SNames BNames N5 L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::L) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'1 : drop N4 ([]::L) EE'
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N5 = N4
Take1 : take N5 L []
============================
 []::L = []::EE'
 < case Take1.

Subgoal 1.33.3.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 N4 SNames BNames L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::L) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'1 : drop N4 ([]::L) EE'
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N4
============================
 []::L = []::EE'
 < compute Take.

Subgoal 1.33.3.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::L) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'1 : drop 1 ([]::L) EE'
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::L = []::EE'
 < Drop: case NNS'1.

Subgoal 1.33.3.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames L N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::L) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::L) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop1 : drop N6 L EE'
============================
 []::L = []::EE'
 < Drop': case Drop1.

Subgoal 1.33.3.1.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
============================
 []::EE' = []::EE'
 < search.

Subgoal 1.33.3.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L1 EE'
============================
 []::(X::L1) = []::EE'
 < G: apply drop_geq_0 to Drop'1.

Subgoal 1.33.3.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L1 EE'
G : N7 >= 0
============================
 []::(X::L1) = []::EE'
 < P: assert 1 + -1 = 0.

Subgoal 1.33.3.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L1 EE'
G : N7 >= 0
P : 1 + -1 = 0
============================
 []::(X::L1) = []::EE'
 < apply drop_is_integer to Drop'1.

Subgoal 1.33.3.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L1 EE'
G : N7 >= 0
P : 1 + -1 = 0
H2 : is_integer N7
============================
 []::(X::L1) = []::EE'
 < apply plus_integer_is_integer to _ _ Drop'.

Subgoal 1.33.3.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N6 N7 L1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N6 = 1
Drop' : 1 + N7 = N6
Drop'1 : drop N7 L1 EE'
G : N7 >= 0
P : 1 + -1 = 0
H2 : is_integer N7
H3 : is_integer N6
============================
 []::(X::L1) = []::EE'
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 1.33.3.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames N7 L1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + N7 = 0
Drop'1 : drop N7 L1 EE'
G : N7 >= 0
P : 1 + -1 = 0
H2 : is_integer N7
H3 : is_integer 0
============================
 []::(X::L1) = []::EE'
 < apply plus_integer_unique_addend to _ _ _ Drop' P.

Subgoal 1.33.3.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames L1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE'
G : -1 >= 0
P : 1 + -1 = 0
H2 : is_integer -1
H3 : is_integer 0
============================
 []::(X::L1) = []::EE'
 < L: case G.

Subgoal 1.33.3.1.2:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 SNames BNames L1 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::(X::L1)) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::(X::L1)) O
LenEE' : length EE' N3
NNS' : length EE' N3
NNS'3 : names [[]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE'
P : 1 + -1 = 0
H2 : is_integer -1
H3 : is_integer 0
L : 0 <= -1
============================
 []::(X::L1) = []::EE'
 < case L.

Subgoal 1.33.3.2:

Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
LenEE' : length (S::BR) N3
NNS' : newNameScopes [[]] N3 AR BR
============================
 S::AR = []::(S::BR)
 < LenBR: case LenEE'.

Subgoal 1.33.3.2:

Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
NNS' : newNameScopes [[]] N3 AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N3
============================
 S::AR = []::(S::BR)
 < apply length_is to LenBR.

Subgoal 1.33.3.2:

Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
NNS' : newNameScopes [[]] N3 AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N3
H2 : is_integer N'
============================
 S::AR = []::(S::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 1.33.3.2:

Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
NNS' : newNameScopes [[]] N3 AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N3
H2 : is_integer N'
LEq : N3 <= N'
============================
 S::AR = []::(S::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 1.33.3.2:

Variables: N FE EE O N2 V1 I E1 N1 SaveL Len N3 BR S AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) (S::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 (S::BR) O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 (S::BR) O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 (S::AR) O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 (S::AR) O
NNS' : newNameScopes [[]] N3 AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = N3
H2 : is_integer N'
LEq : N3 <= N'
L : N' < N3
============================
 S::AR = []::(S::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 EE_A' O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 EE_A' O
NNS_L : newNameScopes [[]] N3 EE_A' EE'
LenEE' : length EE' N3
Eq : EE_A' = []::EE'
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < case Eq.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Ev_DL: assert <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Ev_DLen: assert <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply listLength_is to _ R3.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < P: assert 0 + I = I.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < P': apply plus_integer_comm to _ _ P.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Ev_W_ES: apply length_to_while to R3 NEq P' _ _ with
              FE = FE Ctx = EE'.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Ev_W: apply drop_ext_size_evalStmt to Ev_W_ES.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < LS: assert lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I).

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Ev_N: assert <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < P2: apply ext_size_pos_evalExpr to R2.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < L2: apply lt_plus_one to R1 _.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < Acc: case Acc.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < A2: apply Acc to _ L2.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < LEqN: apply ext_size_pos_evalExpr to R.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < OrN: apply greatereq_integer_greater_or_eq to _ with
          A = N B = 0.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < L0: assert 0 < N.

Subgoal 1.33.4:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
============================
 0 < N
 < C: case OrN.

Subgoal 1.33.4.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
C : N > 0
============================
 0 < N
 < case C.

Subgoal 1.33.4.1:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
H5 : 0 < N
============================
 0 < N
 < search.

Subgoal 1.33.4.2:

Variables: FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O 0 @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = 0
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < 0
Acc : forall M, 0 <= M -> M < 0 -> acc M *
A2 : acc N2 *
LEqN : 0 <= 0
============================
 0 < 0
 < P'': assert 1 + -1 = 0.

Subgoal 1.33.4.2:

Variables: FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O 0 @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = 0
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < 0
Acc : forall M, 0 <= M -> M < 0 -> acc M *
A2 : acc N2 *
LEqN : 0 <= 0
P'' : 1 + -1 = 0
============================
 0 < 0
 < apply plus_integer_unique_addend to _ _ _ P'' R1.

Subgoal 1.33.4.2:

Variables: FE EE EE' O V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O 0 @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + -1 = 0
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O -1 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O -1
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O -1
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer -1
P2 : 0 <= -1
L2 : -1 < 0
Acc : forall M, 0 <= M -> M < 0 -> acc M *
A2 : acc -1 *
LEqN : 0 <= 0
P'' : 1 + -1 = 0
============================
 0 < 0
 < L: case P2.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < A0: apply Acc to _ L0.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply fresh_name_is to _ FrL.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply fresh_name_is to _ FrLen.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply IH to R2 A2 _ _ _.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply IH3 to Ev_DL A2 _ _ _.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply IH3 to Ev_DLen A0 _ _ _.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply IH3 to Ev_W_ES A0 _ _ _.

Subgoal 1.33.5:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
============================
 is_stmt (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))
 < search 20.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply evalStmt_isCtx to _ _ _ Ev_W.

Subgoal 1.33.6:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 is_stmt (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1)))))
 < search 20.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < apply IH to Ev_N A0 _ _ _.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 <evalExpr {P}> FE EE (exactEval:list:length E1) (intVal I) EE' O
 < unfold .

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 exists Names E_P V_P EE_P O_P V,
   (<evalExpr {P}> FE EE E1 V EE' O /\ listLength V I) /\
   (names EE Names /\
   (Names |{expr}- exactEval:list:length E1 ~~> E_P /\
   <evalExpr {P}> FE EE E_P V_P EE_P O_P))
 < exists N1,
   stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len),
   intVal I,
   EE',
   O,
   V1.

Subgoal 1.33:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 (<evalExpr {P}> FE EE E1 V1 EE' O /\ listLength V1 I) /\
 (names EE N1 /\
 (N1 |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len) /\
 <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O))
 < split.

Subgoal 1.33.7:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 <evalExpr {P}> FE EE E1 V1 EE' O
 < search.

Subgoal 1.33.8:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 listLength V1 I
 < search.

Subgoal 1.33.9:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 names EE N1
 < search.

Subgoal 1.33.10:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 N1 |{expr}- exactEval:list:length E1 ~~> stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)
 < search.

Subgoal 1.33.11:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
============================
 <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
 < IsO: apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 1.33.11:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
IsO : is_list is_value O
============================
 <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
 < apply is_list_values_append_nil to IsO.

Subgoal 1.33.11:

Variables: N FE EE EE' O N2 V1 I E1 N1 SaveL Len N3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalExpr {ES}> FE EE (exactEval:list:length E1) (intVal I) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 EE' O N2 **
R3 : listLength V1 I
H1 : is_expr E1
Ev : evalExpr FE EE E1 V1 EE' O
Names : names EE N1
IsN1 : is_list is_string N1
FrL : fresh_name "L" N1 SaveL
FrLen : fresh_name "Len" N1 Len
NEq : SaveL = Len -> false
LenEE : length EE N3
NNS : newNameScopes [[]] N3 ([]::EE) EE
Ev_L_ES : <evalExpr {ES}> FE ([]::EE) E1 V1 ([]::EE') O N2
Ev_L : evalExpr FE ([]::EE) E1 V1 ([]::EE') O
NNS_L : newNameScopes [[]] N3 ([]::EE') EE'
LenEE' : length EE' N3
Ev_DL : <evalStmt {ES}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O N2
Ev_DLen : <evalStmt {ES}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') [] 0
H2 : is_value V1
H3 : is_integer I
P : 0 + I = I
P' : I + 0 = I
Ev_W_ES : <evalStmt {ES}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
Ev_W_ES1 : lookup Fields "null" trueVal
Ev_W : evalStmt FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
LS : lookupScopes Len ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (intVal I)
Ev_N : <evalExpr {ES}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') [] 0
H4 : is_integer N2
P2 : 0 <= N2
L2 : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
LEqN : 0 <= N
OrN : N > 0 \/ N = 0
L0 : 0 < N
A0 : acc 0 *
H5 : is_string SaveL
H6 : is_string Len
H7 : <evalExpr {P}> FE EE E1 V1 EE' O
H8 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveL E1) ([(SaveL, V1)]::EE') O
H9 : is_list (is_list (is_pair is_string is_value)) EE'
H10 : <evalStmt {P}> FE ([(SaveL, V1)]::EE') (declare intTy Len (num 0)) ([(Len, intVal 0), (SaveL, V1)]::EE') []
H11 : <evalStmt {P}> FE ([(Len, intVal 0), (SaveL, V1)]::EE') (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
H12 : is_list (is_list (is_pair is_string is_value)) ([(Len, intVal I), (SaveL, recVal Fields)]::EE')
H13 : <evalExpr {P}> FE ([(Len, intVal I), (SaveL, recVal Fields)]::EE') (name Len) (intVal I) ([(Len, intVal I), (SaveL, recVal Fields)]::EE') []
IsO : is_list is_value O
H14 : O ++ [] = O
============================
 <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy SaveL E1) (seq (declare intTy Len (num 0)) (while (not (recFieldAccess (name SaveL) "null")) (seq (assign SaveL (recFieldAccess (name SaveL) "tail")) (assign Len (plus (name Len) (num 1))))))) (name Len)) (intVal I) EE' O
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsS : is_stmt (listUpdate L I E)
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Is: case IsS.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Ev: apply drop_ext_size_evalExpr to R3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Ev1: apply drop_ext_size_evalExpr to R4.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply ext_size_is_int_evalExpr to R3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply ext_size_is_int_evalExpr to R4.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply plus_integer_is_integer to _ _ R2.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < L4: apply lt_plus_one to R1 _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Acc: case Acc.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply ext_size_pos_evalExpr to R3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply ext_size_pos_evalExpr to R4.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < L2: assert N2 < N.

Subgoal 4.15.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
============================
 N2 < N
 < Or: apply lt_right to R2 _ _ _.

Subgoal 4.15.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
Or : N2 < N4 \/ N2 = N4
============================
 N2 < N
 < L': case Or.

Subgoal 4.15.1.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L' : N2 < N4
============================
 N2 < N
 < L'': apply less_integer_transitive to L' L4.

Subgoal 4.15.1.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L' : N2 < N4
L'' : N2 < N
============================
 N2 < N
 < search.

Subgoal 4.15.1.2:

Variables: N FE EE EE' O N3 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N4 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N4 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N4
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N4
============================
 N4 < N
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < L3: assert N3 < N.

Subgoal 4.15.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
============================
 N3 < N
 < Or: apply lt_left to R2 _ _.

Subgoal 4.15.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
Or : N3 < N4 \/ N3 = N4
============================
 N3 < N
 < L': case Or.

Subgoal 4.15.2.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L' : N3 < N4
============================
 N3 < N
 < L'': apply less_integer_transitive to L' L4.

Subgoal 4.15.2.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L' : N3 < N4
L'' : N3 < N
============================
 N3 < N
 < search.

Subgoal 4.15.2.2:

Variables: N FE EE EE' O N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N4 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N4 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N4
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N4
H5 : 0 <= N2
L2 : N2 < N
============================
 N4 < N
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < A2: apply Acc to _ L2.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < A3: apply Acc to _ L3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply IH to R3 A3 _ _ _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply IH to R4 A2 _ _ _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Names: apply names_exists to IsEE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsNames: apply names_is to _ Names.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Is+: assert is_list is_string (L::N5).

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Pr3: apply fresh_name_exists to _ Is+ with
          Base = "E".

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) F
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Pr1: apply fresh_name_exists to _ Is+ with
          Base = "I".

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F F1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) F
Pr1 : fresh_name "I" (L::N5) F1
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Pr2: apply fresh_name_exists to _ Is+ with
          Base = "Hold".

Subgoal 4.15.3:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F F1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) F
Pr1 : fresh_name "I" (L::N5) F1
============================
 is_string "Hold"
 < search 6.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F F1 F2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) F
Pr1 : fresh_name "I" (L::N5) F1
Pr2 : fresh_name "Hold" (L::N5) F2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Pr3: apply fresh_name_exists to _ Is+ with
          Base = "C".

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 F F1 F2 F3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) F
Pr1 : fresh_name "I" (L::N5) F1
Pr2 : fresh_name "Hold" (L::N5) F2
Pr4 : fresh_name "C" (L::N5) F3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename F to SaveE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE F1 F2 F3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) F1
Pr2 : fresh_name "Hold" (L::N5) F2
Pr4 : fresh_name "C" (L::N5) F3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename F1 to SaveI.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI F2 F3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) F2
Pr4 : fresh_name "C" (L::N5) F3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename F2 to Hold.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold F3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) F3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename F3 to Copy.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert SaveE = L -> false.

Subgoal 4.15.4:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
============================
 SaveE = L -> false
 < intros E.

Subgoal 4.15.4:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
E : SaveE = L
============================
 false
 < case E.

Subgoal 4.15.4:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) L
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
============================
 false
 < apply fresh_name_not_mem to Pr3 _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert SaveI = L -> false.

Subgoal 4.15.5:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
============================
 SaveI = L -> false
 < intros E.

Subgoal 4.15.5:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
E : SaveI = L
============================
 false
 < case E.

Subgoal 4.15.5:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) L
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert Hold = L -> false.

Subgoal 4.15.6:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
============================
 Hold = L -> false
 < intros E.

Subgoal 4.15.6:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
E : Hold = L
============================
 false
 < case E.

Subgoal 4.15.6:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) L
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
============================
 false
 < apply fresh_name_not_mem to Pr2 _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert Copy = L -> false.

Subgoal 4.15.7:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
============================
 Copy = L -> false
 < intros E.

Subgoal 4.15.7:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
E : Copy = L
============================
 false
 < case E.

Subgoal 4.15.7:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) L
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
============================
 false
 < apply fresh_name_not_mem to Pr4 _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert Hold = SaveE -> false.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
============================
 Hold = SaveE -> false
 < intros E.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
E : Hold = SaveE
============================
 false
 < case E.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) SaveE
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : SaveE = L -> false
H12 : Copy = L -> false
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) SaveE
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : SaveE = L -> false
H12 : Copy = L -> false
AppE : "E" ++ S1 = SaveE
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 4.15.8.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) SaveE
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : SaveE = L -> false
H12 : Copy = L -> false
AppE : "E" ++ S1 = SaveE
============================
 is_string "Hold"
 < search 6.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1 S2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) SaveE
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : SaveE = L -> false
H12 : Copy = L -> false
AppE : "E" ++ S1 = SaveE
AppH : "Hold" ++ S2 = SaveE
============================
 false
 < case AppE.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Copy S1 S2 L3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) ("E"::L3)
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) ("E"::L3)
Pr4 : fresh_name "C" (L::N5) Copy
H9 : "E"::L3 = L -> false
H10 : SaveI = L -> false
H11 : "E"::L3 = L -> false
H12 : Copy = L -> false
AppH : "Hold" ++ S2 = "E"::L3
H13 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert Hold = SaveI -> false.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
============================
 Hold = SaveI -> false
 < intros E.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
E : Hold = SaveI
============================
 false
 < case E.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) SaveI
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : SaveI = L -> false
H12 : Copy = L -> false
H13 : SaveI = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) SaveI
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : SaveI = L -> false
H12 : Copy = L -> false
H13 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 4.15.9.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) SaveI
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : SaveI = L -> false
H12 : Copy = L -> false
H13 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Copy S1 S2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) SaveI
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : SaveI = L -> false
H12 : Copy = L -> false
H13 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
AppH : "Hold" ++ S2 = SaveI
============================
 false
 < case AppI.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Copy S1 S2 L3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) ("I"::L3)
Pr2 : fresh_name "Hold" (L::N5) ("I"::L3)
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : "I"::L3 = L -> false
H11 : "I"::L3 = L -> false
H12 : Copy = L -> false
H13 : "I"::L3 = SaveE -> false
AppH : "Hold" ++ S2 = "I"::L3
H14 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < NEqIE: assert SaveI = SaveE -> false.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
============================
 SaveI = SaveE -> false
 < intros E.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
E : SaveI = SaveE
============================
 false
 < case E.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveE
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveE = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveE
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveE = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy S1 S2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveE
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveE = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
AppE : "E" ++ S2 = SaveE
============================
 false
 < case AppI.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 Hold Copy S1 S2 L3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) ("I"::L3)
Pr1 : fresh_name "I" (L::N5) ("I"::L3)
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : "I"::L3 = L -> false
H10 : "I"::L3 = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = "I"::L3 -> false
H14 : Hold = "I"::L3 -> false
AppE : "E" ++ S2 = "I"::L3
H15 : [] ++ S1 = L3
============================
 false
 < case AppE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert Copy = Hold -> false.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 Copy = Hold -> false
 < intros E.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
E : Copy = Hold
============================
 false
 < case E.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Hold
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Hold = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Hold
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Hold = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
AppC : "C" ++ S1 = Hold
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 4.15.11.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Hold
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Hold = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
AppC : "C" ++ S1 = Hold
============================
 is_string "Hold"
 < search 6.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold S1 S2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Hold
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Hold = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
AppC : "C" ++ S1 = Hold
AppH : "Hold" ++ S2 = Hold
============================
 false
 < case AppC.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI S1 S2 L3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) ("C"::L3)
Pr4 : fresh_name "C" (L::N5) ("C"::L3)
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : "C"::L3 = L -> false
H12 : "C"::L3 = L -> false
H13 : "C"::L3 = SaveE -> false
H14 : "C"::L3 = SaveI -> false
NEqIE : SaveI = SaveE -> false
AppH : "Hold" ++ S2 = "C"::L3
H15 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert SaveE = Copy -> false.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
============================
 SaveE = Copy -> false
 < intros E.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
E : SaveE = Copy
============================
 false
 < case E.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) Copy
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : Copy = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = Copy -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = Copy -> false
H15 : Copy = Hold -> false
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) Copy
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : Copy = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = Copy -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = Copy -> false
H15 : Copy = Hold -> false
AppC : "C" ++ S1 = Copy
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy S1 S2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) Copy
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : Copy = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = Copy -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = Copy -> false
H15 : Copy = Hold -> false
AppC : "C" ++ S1 = Copy
AppE : "E" ++ S2 = Copy
============================
 false
 < case AppC.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold S1 S2 L3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) ("C"::L3)
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) ("C"::L3)
H9 : "C"::L3 = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : "C"::L3 = L -> false
H13 : Hold = "C"::L3 -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = "C"::L3 -> false
H15 : "C"::L3 = Hold -> false
AppE : "E" ++ S2 = "C"::L3
H16 : [] ++ S1 = L3
============================
 false
 < case AppE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert SaveI = Copy -> false.

Subgoal 4.15.13:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
============================
 SaveI = Copy -> false
 < intros E.

Subgoal 4.15.13:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
E : SaveI = Copy
============================
 false
 < case E.

Subgoal 4.15.13:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) Copy
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : Copy = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = Copy -> false
NEqIE : Copy = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
============================
 false
 < AppC: apply fresh_name_start to _ Pr4.

Subgoal 4.15.13:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy S1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) Copy
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : Copy = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = Copy -> false
NEqIE : Copy = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
AppC : "C" ++ S1 = Copy
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 4.15.13:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold Copy S1 S2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) Copy
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : Copy = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = Copy -> false
NEqIE : Copy = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
AppC : "C" ++ S1 = Copy
AppI : "I" ++ S2 = Copy
============================
 false
 < case AppC.

Subgoal 4.15.13:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE Hold S1 S2 L3
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) ("C"::L3)
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) ("C"::L3)
H9 : SaveE = L -> false
H10 : "C"::L3 = L -> false
H11 : Hold = L -> false
H12 : "C"::L3 = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = "C"::L3 -> false
NEqIE : "C"::L3 = SaveE -> false
H15 : "C"::L3 = Hold -> false
H16 : SaveE = "C"::L3 -> false
AppI : "I" ++ S2 = "C"::L3
H17 : [] ++ S1 = L3
============================
 false
 < case AppI.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE N6
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename N6 to Len.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < NNS: assert newNameScopes [[]] Len ([]::EE) EE.

Subgoal 4.15.14:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 newNameScopes [[]] Len ([]::EE) EE
 < unfold .

Subgoal 4.15.14:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 exists N SNames BNames,
   ((((length EE Len /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   N5.

Subgoal 4.15.14:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 ((((length EE Len /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE N5) /\
 (forall X, mem X [] -> mem X N5 -> false)
 < split.

Subgoal 4.15.14.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 length EE Len
 < search.

Subgoal 4.15.14.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 4.15.14.3:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 4.15.14.4:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 names [[]] []
 < search.

Subgoal 4.15.14.5:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 names EE N5
 < search.

Subgoal 4.15.14.6:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
============================
 forall X, mem X [] -> mem X N5 -> false
 < intros M.

Subgoal 4.15.14.6:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
M : mem X []
H18 : mem X N5
============================
 false
 < case M.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvI': apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R3 NNS.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvI'': apply drop_ext_size_evalExpr to EvI'.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvI'' Ev _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2
NNS' : newNameScopes [[]] Len EE_A' EE2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Eq: assert EE_A' = []::EE2.

Subgoal 4.15.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2
NNS' : newNameScopes [[]] Len EE_A' EE2
============================
 EE_A' = []::EE2
 < NNS': case NNS'.

Subgoal 4.15.15.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A' N6 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2
NNS' : length EE2 Len
NNS'1 : drop N6 EE_A' EE2
NNS'2 : take N6 EE_A' [[]]
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A' = []::EE2
 < Take: case NNS'2.

Subgoal 4.15.15.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 SNames BNames N7 L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::L1) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::L1) O2
NNS' : length EE2 Len
NNS'1 : drop N6 ([]::L1) EE2
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N7 = N6
Take1 : take N7 L1 []
============================
 []::L1 = []::EE2
 < case Take1.

Subgoal 4.15.15.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::L1) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::L1) O2
NNS' : length EE2 Len
NNS'1 : drop N6 ([]::L1) EE2
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N6
============================
 []::L1 = []::EE2
 < compute Take.

Subgoal 4.15.15.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::L1) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::L1) O2
NNS' : length EE2 Len
NNS'1 : drop 1 ([]::L1) EE2
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::L1 = []::EE2
 < apply drop_one to NNS'1.

Subgoal 4.15.15.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : length EE2 Len
NNS'1 : drop 1 ([]::EE2) EE2
NNS'3 : names [[]] SNames
NNS'4 : names EE2 BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 []::EE2 = []::EE2
 < search.

Subgoal 4.15.15.2:

Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 **
R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2
H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
============================
 S1::AR = []::(S1::BR)
 < LenBR+: apply evalExpr_keep_scopes to _ _ _ Ev LenEE.

Subgoal 4.15.15.2:

Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 **
R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2
H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR+ : length (S1::BR) Len
============================
 S1::AR = []::(S1::BR)
 < LenBR: case LenBR+.

Subgoal 4.15.15.2:

Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 **
R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2
H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
============================
 S1::AR = []::(S1::BR)
 < apply length_is to LenBR.

Subgoal 4.15.15.2:

Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 **
R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2
H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H18 : is_integer N'
============================
 S1::AR = []::(S1::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 4.15.15.2:

Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 **
R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2
H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H18 : is_integer N'
L : N' < Len
============================
 S1::AR = []::(S1::BR)
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 4.15.15.2:

Variables: N FE EE EE' O N3 N2 N4 N1 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) (S1::BR) O2 N3 **
R4 : <evalExpr {ES}> FE (S1::BR) E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) (S1::BR) O2
Ev1 : evalExpr FE (S1::BR) E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
H7 : <evalExpr {P}> FE EE I (intVal N1) (S1::BR) O2
H8 : <evalExpr {P}> FE (S1::BR) E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) (S1::AR) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) (S1::AR) O2
NNS' : newNameScopes [[]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H18 : is_integer N'
L : N' < Len
LEq : Len <= N'
============================
 S1::AR = []::(S1::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) EE_A' O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) EE_A' O2
NNS' : newNameScopes [[]] Len EE_A' EE2
Eq : EE_A' = []::EE2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < case Eq.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply IH to EvI' A3 _ _ _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvAI: assert <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply fresh_name_is to _ Pr1.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsEE2: apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Names2: apply names_exists to IsEE2.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < NS: apply evalExpr_names_same to _ _ _ Ev.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Len2: apply evalExpr_keep_scopes to _ _ _ Ev LenEE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < NNS+: assert newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2.

Subgoal 4.15.16:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
 < unfold .

Subgoal 4.15.16:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 exists N SNames BNames,
   ((((length EE2 Len /\ drop N ([(SaveI, intVal N1)]::EE2) EE2) /\
   take N ([(SaveI, intVal N1)]::EE2) [[(SaveI, intVal N1)]]) /\
   names [[(SaveI, intVal N1)]] SNames) /\
   names EE2 BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveI],
   N6.

Subgoal 4.15.16:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 ((((length EE2 Len /\ drop 1 ([(SaveI, intVal N1)]::EE2) EE2) /\
 take 1 ([(SaveI, intVal N1)]::EE2) [[(SaveI, intVal N1)]]) /\
 names [[(SaveI, intVal N1)]] [SaveI]) /\
 names EE2 N6) /\
 (forall X, mem X [SaveI] -> mem X N6 -> false)
 < split.

Subgoal 4.15.16.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 length EE2 Len
 < search.

Subgoal 4.15.16.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 drop 1 ([(SaveI, intVal N1)]::EE2) EE2
 < search.

Subgoal 4.15.16.3:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 take 1 ([(SaveI, intVal N1)]::EE2) [[(SaveI, intVal N1)]]
 < search.

Subgoal 4.15.16.4:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 names [[(SaveI, intVal N1)]] [SaveI]
 < search.

Subgoal 4.15.16.5:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 names EE2 N6
 < search.

Subgoal 4.15.16.6:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
============================
 forall X, mem X [SaveI] -> mem X N6 -> false
 < intros M MX.

Subgoal 4.15.16.6:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
M : mem X [SaveI]
MX : mem X N6
============================
 false
 < M: case M.

Subgoal 4.15.16.6.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
MX : mem SaveI N6
============================
 false
 < NS': apply names_same_symmetric to NS.

Subgoal 4.15.16.6.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
MX : mem SaveI N6
NS' : names_same EE2 EE
============================
 false
 < M': apply names_same_names to NS' Names2 Names MX.

Subgoal 4.15.16.6.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
MX : mem SaveI N6
NS' : names_same EE2 EE
M' : mem SaveI N5
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 4.15.16.6.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
MX : mem X N6
M : mem X []
============================
 false
 < case M.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvE': apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R4 NNS+.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvE'': apply drop_ext_size_evalExpr to EvE'.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < NNS'': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvE'' Ev1 _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len EE_A'1 EE4
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Len4: apply evalExpr_keep_scopes to _ _ _ Ev1 Len2.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len EE_A'1 EE4
Len4 : length EE4 Len
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Eq: assert EE_A'1 = [(SaveI, intVal N1)]::EE4.

Subgoal 4.15.17:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len EE_A'1 EE4
Len4 : length EE4 Len
============================
 EE_A'1 = [(SaveI, intVal N1)]::EE4
 < NN: case NNS''.

Subgoal 4.15.17.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1 N7 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop N7 EE_A'1 EE4
NN2 : take N7 EE_A'1 [[(SaveI, intVal N1)]]
NN3 : names [[(SaveI, intVal N1)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A'1 = [(SaveI, intVal N1)]::EE4
 < Take: case NN2.

Subgoal 4.15.17.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 SNames BNames N8 L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop N7 ([(SaveI, intVal N1)]::L1) EE4
NN3 : names [[(SaveI, intVal N1)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N8 = N7
Take1 : take N8 L1 []
============================
 [(SaveI, intVal N1)]::L1 = [(SaveI, intVal N1)]::EE4
 < Take: case Take1.

Subgoal 4.15.17.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop N7 ([(SaveI, intVal N1)]::L1) EE4
NN3 : names [[(SaveI, intVal N1)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N7
============================
 [(SaveI, intVal N1)]::L1 = [(SaveI, intVal N1)]::EE4
 < compute Take.

Subgoal 4.15.17.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::L1) O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop 1 ([(SaveI, intVal N1)]::L1) EE4
NN3 : names [[(SaveI, intVal N1)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveI, intVal N1)]::L1 = [(SaveI, intVal N1)]::EE4
 < apply drop_one to NN1.

Subgoal 4.15.17.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
Len4 : length EE4 Len
NN : length EE4 Len
NN1 : drop 1 ([(SaveI, intVal N1)]::EE4) EE4
NN3 : names [[(SaveI, intVal N1)]] SNames
NN4 : names EE4 BNames
NN5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 [(SaveI, intVal N1)]::EE4 = [(SaveI, intVal N1)]::EE4
 < search.

Subgoal 4.15.17.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 **
R5 : lookupScopes L (S1::BR) LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 (S1::BR) EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3
Len4 : length (S1::BR) Len
NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR
============================
 S1::AR = [(SaveI, intVal N1)]::(S1::BR)
 < LenBR: case Len4.

Subgoal 4.15.17.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 **
R5 : lookupScopes L (S1::BR) LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 (S1::BR) EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3
NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
============================
 S1::AR = [(SaveI, intVal N1)]::(S1::BR)
 < apply length_is to LenBR.

Subgoal 4.15.17.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 **
R5 : lookupScopes L (S1::BR) LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 (S1::BR) EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3
NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H21 : is_integer N'
============================
 S1::AR = [(SaveI, intVal N1)]::(S1::BR)
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 4.15.17.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 **
R5 : lookupScopes L (S1::BR) LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 (S1::BR) EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3
NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H21 : is_integer N'
L : N' < Len
============================
 S1::AR = [(SaveI, intVal N1)]::(S1::BR)
 < LEq: apply newNameScopes_length to NN LenBR.

Subgoal 4.15.17.2:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V (S1::BR) O3 N2 **
R5 : lookupScopes L (S1::BR) LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 (S1::BR) EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V (S1::BR) O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V (S1::BR) O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V (S1::AR) O3
NN : newNameScopes [[(SaveI, intVal N1)]] Len AR BR
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H21 : is_integer N'
L : N' < Len
LEq : Len <= N'
============================
 S1::AR = [(SaveI, intVal N1)]::(S1::BR)
 < apply less_lesseq_flip_false to L LEq.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V EE_A'1 O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len EE_A'1 EE4
Len4 : length EE4 Len
Eq : EE_A'1 = [(SaveI, intVal N1)]::EE4
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < case Eq.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply IH to EvE' A2 _ _ _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvAE: assert <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply fresh_name_is to _ Pr3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsEE4: apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvMI: assert <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) [].

Subgoal 4.15.18:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
 < assert SaveE = SaveI -> false.

Subgoal 4.15.18.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 SaveE = SaveI -> false
 < intros E.

Subgoal 4.15.18.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
E : SaveE = SaveI
============================
 false
 < case E.

Subgoal 4.15.18.1:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveI
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveI = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveI -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveI -> false
H15 : Copy = Hold -> false
H16 : SaveI = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveI E) ([(SaveI, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveI
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 false
 < backchain NEqIE.

Subgoal 4.15.18:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
H24 : SaveE = SaveI -> false
============================
 <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsEE4: apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Names4: apply names_exists to IsEE4.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply names_is to _ Names4.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvH: assert <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (exactEval:list:nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) [].

Subgoal 4.15.19:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
============================
 <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
 < search 6.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsSaveI: apply fresh_name_is to _ Pr1.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsHold: apply fresh_name_is to _ Pr2.

Subgoal 4.15.20:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsCopy: apply fresh_name_is to _ Pr4.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < GEq: apply updateListIndex_pos to R6.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N1 >= 0
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N1 >= 0
H25 : is_value V
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Main: apply proj_listUpdate_eval to _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ with
           OldL = LV
           I = N1
           V = V
           NewL = LV2
           Hold = Hold
           Copy = Copy
           SaveI = SaveI
           SaveE = SaveE G = EE4 L = L HoldL = recVal [("null", trueVal)].

Subgoal 4.15.21:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N1 >= 0
H25 : is_value V
============================
 is_list (is_list (is_pair is_string is_value)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4)
 < search 12.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 G' LV1 HFs
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N1 >= 0
H25 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < exists G'.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 G' LV1 HFs
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N1 >= 0
H25 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsO3: apply evalExpr_isOutput to _ _ _ Ev1.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 G' LV1 HFs
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N1 >= 0
H25 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
IsO3 : is_list is_value O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply is_list_values_append_nil to IsO3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 N1 EE2 O2 V EE4 O3 LV LV2 E I L N5 SaveE SaveI Hold Copy Len N6 N7 G' LV1 HFs
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listUpdate L I E) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N3 + N2 = N4
R3 : <evalExpr {ES}> FE EE I (intVal N1) EE2 O2 N3 **
R4 : <evalExpr {ES}> FE EE2 E V EE4 O3 N2 **
R5 : lookupScopes L EE4 LV
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE4 EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : evalExpr FE EE I (intVal N1) EE2 O2
Ev1 : evalExpr FE EE2 E V EE4 O3
H1 : is_integer N3
H2 : is_integer N2
H3 : is_integer N4
L4 : N4 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N3
H5 : 0 <= N2
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : is_list (is_list (is_pair is_string is_value)) EE2
H7 : <evalExpr {P}> FE EE I (intVal N1) EE2 O2
H8 : <evalExpr {P}> FE EE2 E V EE4 O3
Names : names EE N5
IsNames : is_list is_string N5
Is+ : is_list is_string (L::N5)
Pr3 : fresh_name "E" (L::N5) SaveE
Pr1 : fresh_name "I" (L::N5) SaveI
Pr2 : fresh_name "Hold" (L::N5) Hold
Pr4 : fresh_name "C" (L::N5) Copy
H9 : SaveE = L -> false
H10 : SaveI = L -> false
H11 : Hold = L -> false
H12 : Copy = L -> false
H13 : Hold = SaveE -> false
H14 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
H15 : Copy = Hold -> false
H16 : SaveE = Copy -> false
H17 : SaveI = Copy -> false
LenEE : length EE Len
NNS : newNameScopes [[]] Len ([]::EE) EE
EvI' : <evalExpr {ES}> FE ([]::EE) I (intVal N1) ([]::EE2) O2 N3
EvI'' : evalExpr FE ([]::EE) I (intVal N1) ([]::EE2) O2
NNS' : newNameScopes [[]] Len ([]::EE2) EE2
H18 : <evalExpr {P}> FE ([]::EE) I (intVal N1) ([]::EE2) O2
EvAI : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE2) O2
H19 : is_string SaveI
H20 : is_value (intVal N1)
IsEE2 : is_list (is_list (is_pair is_string is_value)) EE2
Names2 : names EE2 N6
NS : names_same EE EE2
Len2 : length EE2 Len
NNS+ : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE2) EE2
EvE' : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3 N2
EvE'' : evalExpr FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
NNS'' : newNameScopes [[(SaveI, intVal N1)]] Len ([(SaveI, intVal N1)]::EE4) EE4
Len4 : length EE4 Len
H21 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE2) E V ([(SaveI, intVal N1)]::EE4) O3
EvAE : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE2) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE4) O3
H22 : is_string SaveE
H23 : is_value V
IsEE4 : is_list (is_list (is_pair is_string is_value)) EE4
EvMI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE4) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE4) []
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE4
Names4 : names EE4 N7
H24 : is_list is_string N7
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE4) (declare intTy Hold (nil intTy)) ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
IsCopy : is_string Copy
GEq : N1 >= 0
H25 : is_value V
Main : <evalStmt {P}> FE ([(Hold, recVal [("null", trueVal)]), (SaveI, intVal N1), (SaveE, V)]::EE4) (seq (while (and (not (eq (name SaveI) (num 0))) (not (null (name L)))) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (declare intTy Copy (name L)) (seq (recUpdate Copy ["tail"] (name Hold)) (seq (assign Hold (name Copy)) (assign L (tail (name L)))))))) (seq (ifThenElse (null (name L)) (declare intTy Copy (errorExpr (stringLit "Invalid update") intTy)) noop) (seq (recUpdate L ["head"] (name SaveE)) (while (not (null (name Hold))) (seq (declare intTy Copy (name Hold)) (seq (recUpdate Copy ["tail"] (name L)) (seq (assign L (name Copy)) (assign Hold (tail (name Hold)))))))))) ([(Hold, recVal HFs), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : lookup HFs "null" trueVal
Main2 : replaceScopes L LV1 EE4 G'
Main3 : flipOnto (recVal [("null", trueVal)]) LV2 LV1
IsO3 : is_list is_value O3
H26 : O3 ++ [] = O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < search 20.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsS : is_stmt (listForeach X L Body)
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < IsS: case IsS.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply ext_size_is_int_evalExpr to R3.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply ext_size_is_int_iterateList to R4.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply ext_size_pos_evalExpr to R3.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply ext_size_pos_iterateList to R4.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply plus_integer_is_integer to _ _ R2.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < L4: apply lt_plus_one to R1 _.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Acc': case Acc (keep).

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < L2: assert N2 < N.

Subgoal 4.16.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
 N2 < N
 < Or: apply lt_left to R2 _ _.

Subgoal 4.16.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
Or : N2 < N4 \/ N2 = N4
============================
 N2 < N
 < L': case Or.

Subgoal 4.16.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
============================
 N2 < N
 < apply less_integer_transitive to L' L4.

Subgoal 4.16.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
H6 : N2 < N
============================
 N2 < N
 < search.

Subgoal 4.16.1.2:

Variables: N FE EE EE' O N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N4 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N4 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N4
H2 : is_integer N3
H3 : 0 <= N4
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
 N4 < N
 < search.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < L3: assert N3 < N.

Subgoal 4.16.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
============================
 N3 < N
 < Or: apply lt_right to R2 _ _ _.

Subgoal 4.16.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
Or : N3 < N4 \/ N3 = N4
============================
 N3 < N
 < L': case Or.

Subgoal 4.16.2.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L' : N3 < N4
============================
 N3 < N
 < apply less_integer_transitive to L' L4.

Subgoal 4.16.2.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L' : N3 < N4
H6 : N3 < N
============================
 N3 < N
 < search.

Subgoal 4.16.2.2:

Variables: N FE EE EE' O N2 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N4 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N4
H3 : 0 <= N2
H4 : 0 <= N4
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
============================
 N4 < N
 < search.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < A2: apply Acc' to _ L2.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply IH to R3 A2 _ _ _.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Ev: apply drop_ext_size_evalExpr to R3.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < A3: apply Acc' to _ L3.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < ILP: apply IH10 to R4 A3 _ _ _ _ _.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < EvE: apply drop_ext_size_evalExpr to R3.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < IsEE3: apply evalExpr_isCtx to _ _ _ EvE.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Names: apply names_exists to IsEE.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < IsN1: apply names_is to _ Names.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Fr: apply fresh_name_exists to _ _ with
         Base = "L" Names = X::N1.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) F
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < LenEE3: apply length_exists_list_pair_string_value to IsEE3.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 F N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) F
LenEE3 : length EE3 N5
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < rename F to SaveL.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 N5
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < rename N5 to Len.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Names3: apply names_exists to IsEE3.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NS: apply evalExpr_names_same to _ _ _ EvE.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NNS: assert newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3.

Subgoal 4.16.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
 < unfold .

Subgoal 4.16.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 exists N SNames BNames,
   ((((length EE3 Len /\ drop N ([(SaveL, LV)]::EE3) EE3) /\
   take N ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\
   names [[(SaveL, LV)]] SNames) /\
   names EE3 BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveL],
   N5.

Subgoal 4.16.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 ((((length EE3 Len /\ drop 1 ([(SaveL, LV)]::EE3) EE3) /\
 take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]) /\
 names [[(SaveL, LV)]] [SaveL]) /\
 names EE3 N5) /\
 (forall X, mem X [SaveL] -> mem X N5 -> false)
 < split.

Subgoal 4.16.3.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 length EE3 Len
 < search.

Subgoal 4.16.3.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 drop 1 ([(SaveL, LV)]::EE3) EE3
 < search.

Subgoal 4.16.3.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 take 1 ([(SaveL, LV)]::EE3) [[(SaveL, LV)]]
 < search.

Subgoal 4.16.3.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 names [[(SaveL, LV)]] [SaveL]
 < search.

Subgoal 4.16.3.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 names EE3 N5
 < search.

Subgoal 4.16.3.6:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
============================
 forall X, mem X [SaveL] -> mem X N5 -> false
 < intros MSL MX.

Subgoal 4.16.3.6:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
MSL : mem X1 [SaveL]
MX : mem X1 N5
============================
 false
 < MSL: case MSL.

Subgoal 4.16.3.6.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
MX : mem SaveL N5
============================
 false
 < NS': apply names_same_symmetric to NS.

Subgoal 4.16.3.6.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
MX : mem SaveL N5
NS' : names_same EE3 EE
============================
 false
 < MX1: apply names_same_names to NS' Names3 Names MX.

Subgoal 4.16.3.6.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
MX : mem SaveL N5
NS' : names_same EE3 EE
MX1 : mem SaveL N1
============================
 false
 < apply fresh_name_not_mem to Fr _.

Subgoal 4.16.3.6.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
MX : mem X1 N5
MSL : mem X1 []
============================
 false
 < case MSL.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply fresh_name_is to _ Fr.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < ILP': apply iterateList_newNameScopes_exists_ES to _ _ _ _ _ _ R4 NNS.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < IL: apply drop_ext_size_iterateList to R4.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < IL': apply drop_ext_size_iterateList to ILP'.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NNS': apply iterateList_newNameScopes to _ _ _ _ _ _ IL' IL NNS.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3
NNS' : newNameScopes [[(SaveL, LV)]] Len EE_A' EE'
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NNS': case NNS'.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 EE_A' N6 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body EE_A' O3
NNS' : length EE' Len
NNS'1 : drop N6 EE_A' EE'
NNS'2 : take N6 EE_A' [[(SaveL, LV)]]
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Take: case NNS'2.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 N6 SNames BNames N7 L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'1 : drop N6 ([(SaveL, LV)]::L1) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N7 = N6
Take1 : take N7 L1 []
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < case Take1.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 N6 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'1 : drop N6 ([(SaveL, LV)]::L1) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N6
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < compute Take.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'1 : drop 1 ([(SaveL, LV)]::L1) EE'
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Drop: case NNS'1.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1 N8
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N8 = 1
Drop1 : drop N8 L1 EE'
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < IsN8: apply drop_is_integer to Drop1.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1 N8
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N8 = 1
Drop1 : drop N8 L1 EE'
IsN8 : is_integer N8
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE'
IsN8 : is_integer 0
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Eq: assert L1 = EE'.

Subgoal 4.16.4.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE'
IsN8 : is_integer 0
============================
 L1 = EE'
 < D: case Drop1.

Subgoal 4.16.4.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
IsN8 : is_integer 0
============================
 EE' = EE'
 < search.

Subgoal 4.16.4.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 L2 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
IsN8 : is_integer 0
D : 1 + N9 = 0
D1 : drop N9 L2 EE'
============================
 X1::L2 = EE'
 < GEq: apply drop_geq_0 to D1.

Subgoal 4.16.4.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 L2 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
IsN8 : is_integer 0
D : 1 + N9 = 0
D1 : drop N9 L2 EE'
GEq : N9 >= 0
============================
 X1::L2 = EE'
 < apply drop_is_integer to D1.

Subgoal 4.16.4.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 L2 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
IsN8 : is_integer 0
D : 1 + N9 = 0
D1 : drop N9 L2 EE'
GEq : N9 >= 0
H10 : is_integer N9
============================
 X1::L2 = EE'
 < P: assert 1 + -1 = 0.

Subgoal 4.16.4.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 L2 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
IsN8 : is_integer 0
D : 1 + N9 = 0
D1 : drop N9 L2 EE'
GEq : N9 >= 0
H10 : is_integer N9
P : 1 + -1 = 0
============================
 X1::L2 = EE'
 < apply plus_integer_unique_addend to _ _ _ P D.

Subgoal 4.16.4.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L2 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
IsN8 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE'
GEq : -1 >= 0
H10 : is_integer -1
P : 1 + -1 = 0
============================
 X1::L2 = EE'
 < LEq: case GEq.

Subgoal 4.16.4.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L2 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::(X1::L2)) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
IsN8 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE'
H10 : is_integer -1
P : 1 + -1 = 0
LEq : 0 <= -1
============================
 X1::L2 = EE'
 < case LEq.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L1 EE'
IsN8 : is_integer 0
Eq : L1 = EE'
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < case Eq.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE' EE'
IsN8 : is_integer 0
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < clear Take
   Drop
   Drop1
   IsN8.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < ILP'': apply IH4 to ILP' A3 _ _ _ _ _.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Fr': assert fresh_name "L" (X::N5) SaveL.

Subgoal 4.16.4.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
============================
 fresh_name "L" (X::N5) SaveL
 < apply names_is to _ Names3.

Subgoal 4.16.4.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
============================
 fresh_name "L" (X::N5) SaveL
 < Fr': apply fresh_name_exists to _ _ with
          Base = "L" Names = X::N5.

Subgoal 4.16.4.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
============================
 fresh_name "L" (X::N5) SaveL
 < apply fresh_name_unique_mems to Fr Fr' _ _.

Subgoal 4.16.4.2.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
============================
 forall X1, mem X1 (X::N5) -> mem X1 (X::N1)
 < intros M.

Subgoal 4.16.4.2.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
M : mem X1 (X::N5)
============================
 mem X1 (X::N1)
 < M: case M.

Subgoal 4.16.4.2.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
============================
 mem X (X::N1)
 < search.

Subgoal 4.16.4.2.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
M : mem X1 N5
============================
 mem X1 (X::N1)
 < NS': apply names_same_symmetric to NS.

Subgoal 4.16.4.2.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
M : mem X1 N5
NS' : names_same EE3 EE
============================
 mem X1 (X::N1)
 < apply names_same_names to NS' Names3 Names M.

Subgoal 4.16.4.2.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
M : mem X1 N5
NS' : names_same EE3 EE
H11 : mem X1 N1
============================
 mem X1 (X::N1)
 < search.

Subgoal 4.16.4.2.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
============================
 forall X1, mem X1 (X::N1) -> mem X1 (X::N5)
 < intros M.

Subgoal 4.16.4.2.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
M : mem X1 (X::N1)
============================
 mem X1 (X::N5)
 < M: case M.

Subgoal 4.16.4.2.2.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
============================
 mem X (X::N5)
 < search.

Subgoal 4.16.4.2.2.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
M : mem X1 N1
============================
 mem X1 (X::N5)
 < apply names_same_names to NS Names Names3 M.

Subgoal 4.16.4.2.2.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames F X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
M : mem X1 N1
H11 : mem X1 N5
============================
 mem X1 (X::N5)
 < search.

Subgoal 4.16.4.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 Len N5 SNames BNames F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) F
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(F, LV)]] Len ([(F, LV)]::EE3) EE3
H9 : is_string F
ILP' : <iterateList {ES}> FE ([(F, LV)]::EE3) LV X Body ([(F, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(F, LV)]::EE3) LV X Body ([(F, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(F, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(F, LV)]::EE3) LV X Body ([(F, LV)]::EE') O3
H10 : is_list is_string N5
Fr' : fresh_name "L" (X::N5) F
============================
 fresh_name "L" (X::N5) F
 < search.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Plus: apply plus_integer_total to _ _ with
           N1 = 1 N2 = N3.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < EvWP: assert exists V',
     <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3.

Subgoal 4.16.4.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < Or: apply lt_right to R2 _ _ _.

Subgoal 4.16.4.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
Or : N3 < N4 \/ N3 = N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < L: case Or.

Subgoal 4.16.4.3.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
L : N3 < N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < LEq: apply less_integer_step_lesseq to _ _ L Plus.

Subgoal 4.16.4.3.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
L : N3 < N4
LEq : N9 <= N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < Or: apply lesseq_integer_less_or_eq to LEq.

Subgoal 4.16.4.3.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
L : N3 < N4
LEq : N9 <= N4
Or : N9 < N4 \/ N9 = N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < L': case Or.

Subgoal 4.16.4.3.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
L : N3 < N4
LEq : N9 <= N4
L' : N9 < N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < L9: apply less_integer_transitive to L' L4.

Subgoal 4.16.4.3.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
L : N3 < N4
LEq : N9 <= N4
L' : N9 < N4
L9 : N9 < N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < apply lesseq_integer__add_positive to _ _ Plus with
     Base = 0.

Subgoal 4.16.4.3.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
L : N3 < N4
LEq : N9 <= N4
L' : N9 < N4
L9 : N9 < N
H10 : 0 <= N9
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < A9: apply Acc' to _ L9.

Subgoal 4.16.4.3.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
L : N3 < N4
LEq : N9 <= N4
L' : N9 < N4
L9 : N9 < N
H10 : 0 <= N9
A9 : acc N9 *
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < apply IH_IL_W to _ _ _ _ _ R4 Plus A9 Names3 Fr'.

Subgoal 4.16.4.3.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
L : N3 < N4
LEq : N9 <= N4
L' : N9 < N4
L9 : N9 < N
H10 : 0 <= N9
A9 : acc N9 *
H11 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < search.

Subgoal 4.16.4.3.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N4
L : N3 < N4
LEq : N4 <= N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < apply lesseq_integer__add_positive to _ _ R2 with
     Base = 0.

Subgoal 4.16.4.3.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N4
L : N3 < N4
LEq : N4 <= N4
H10 : 0 <= N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < A4: apply Acc' to _ L4.

Subgoal 4.16.4.3.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N4
L : N3 < N4
LEq : N4 <= N4
H10 : 0 <= N4
A4 : acc N4 *
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < apply IH_IL_W to _ _ _ _ _ R4 Plus A4 Names3 Fr'.

Subgoal 4.16.4.3.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames V'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N4
L : N3 < N4
LEq : N4 <= N4
H10 : 0 <= N4
A4 : acc N4 *
H11 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < search.

Subgoal 4.16.4.3.2:

Variables: N FE EE EE' O N2 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N4 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N4
H3 : 0 <= N2
H4 : 0 <= N4
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N4 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N4 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N4
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N4 = N9
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < apply plus_integer_unique to Plus R1.

Subgoal 4.16.4.3.2:

Variables: N FE EE EE' O N2 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N4 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N4
H3 : 0 <= N2
H4 : 0 <= N4
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N4 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N4 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N4
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N4 = N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < apply IH_IL_W to _ _ _ _ _ R4 Plus Acc Names3 Fr'.

Subgoal 4.16.4.3.2:

Variables: N FE EE EE' O N2 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames V'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N4 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N4
H3 : 0 <= N2
H4 : 0 <= N4
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N4 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N4 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N4
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N4 = N
H10 : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < search.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : exists V',
         <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < EvWP: case EvWP.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NNS_: assert newNameScopes [[]] N11 ([]::EE) EE.

Subgoal 4.16.4.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 newNameScopes [[]] N11 ([]::EE) EE
 < unfold .

Subgoal 4.16.4.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 exists N SNames BNames,
   ((((length EE N11 /\ drop N ([]::EE) EE) /\ take N ([]::EE) [[]]) /\
   names [[]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [],
   N1.

Subgoal 4.16.4.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 ((((length EE N11 /\ drop 1 ([]::EE) EE) /\ take 1 ([]::EE) [[]]) /\
 names [[]] []) /\
 names EE N1) /\
 (forall X, mem X [] -> mem X N1 -> false)
 < split.

Subgoal 4.16.4.4.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 length EE N11
 < search.

Subgoal 4.16.4.4.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 drop 1 ([]::EE) EE
 < search.

Subgoal 4.16.4.4.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 take 1 ([]::EE) [[]]
 < search.

Subgoal 4.16.4.4.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 names [[]] []
 < search.

Subgoal 4.16.4.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 names EE N1
 < search.

Subgoal 4.16.4.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
============================
 forall X, mem X [] -> mem X N1 -> false
 < intros M.

Subgoal 4.16.4.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
M : mem X1 []
H10 : mem X1 N1
============================
 false
 < case M.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < EvE+: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R3 NNS_.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV EE_A'1 O2 N2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < EvE+': apply drop_ext_size_evalExpr to EvE+.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV EE_A'1 O2 N2
EvE+' : evalExpr FE ([]::EE) L LV EE_A'1 O2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NNS+: apply evalExpr_newNameScopes_ctx to _ _ _ _ EvE+' EvE _.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 EE_A'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV EE_A'1 O2 N2
EvE+' : evalExpr FE ([]::EE) L LV EE_A'1 O2
NNS+ : newNameScopes [[]] N11 EE_A'1 EE3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NNS+: case NNS+.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 EE_A'1 N12 SNames1 BNames1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV EE_A'1 O2 N2
EvE+' : evalExpr FE ([]::EE) L LV EE_A'1 O2
NNS+ : length EE3 N11
NNS+1 : drop N12 EE_A'1 EE3
NNS+2 : take N12 EE_A'1 [[]]
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Take: case NNS+2.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 N12 SNames1 BNames1 N13 L2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2
NNS+ : length EE3 N11
NNS+1 : drop N12 ([]::L2) EE3
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + N13 = N12
Take1 : take N13 L2 []
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < case Take1.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 N12 SNames1 BNames1 L2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2
NNS+ : length EE3 N11
NNS+1 : drop N12 ([]::L2) EE3
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = N12
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < compute Take.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2
NNS+ : length EE3 N11
NNS+1 : drop 1 ([]::L2) EE3
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Drop: case NNS+1.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + N14 = 1
Drop1 : drop N14 L2 EE3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < Eq: assert L2 = EE3.

Subgoal 4.16.4.5.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + N14 = 1
Drop1 : drop N14 L2 EE3
============================
 L2 = EE3
 < apply drop_is_integer to Drop1.

Subgoal 4.16.4.5.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + N14 = 1
Drop1 : drop N14 L2 EE3
H10 : is_integer N14
============================
 L2 = EE3
 < D: case Drop1.

Subgoal 4.16.4.5.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H10 : is_integer 0
============================
 EE3 = EE3
 < search.

Subgoal 4.16.4.5.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14 N15 L3 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + N14 = 1
H10 : is_integer N14
D : 1 + N15 = N14
D1 : drop N15 L3 EE3
============================
 X1::L3 = EE3
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 4.16.4.5.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N15 L3 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H10 : is_integer 0
D : 1 + N15 = 0
D1 : drop N15 L3 EE3
============================
 X1::L3 = EE3
 < P: assert 1 + -1 = 0.

Subgoal 4.16.4.5.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N15 L3 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H10 : is_integer 0
D : 1 + N15 = 0
D1 : drop N15 L3 EE3
P : 1 + -1 = 0
============================
 X1::L3 = EE3
 < apply drop_is_integer to D1.

Subgoal 4.16.4.5.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N15 L3 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H10 : is_integer 0
D : 1 + N15 = 0
D1 : drop N15 L3 EE3
P : 1 + -1 = 0
H11 : is_integer N15
============================
 X1::L3 = EE3
 < apply plus_integer_unique_addend to _ _ _ P D.

Subgoal 4.16.4.5.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L3 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H10 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L3 EE3
P : 1 + -1 = 0
H11 : is_integer -1
============================
 X1::L3 = EE3
 < GEq: apply drop_geq_0 to D1.

Subgoal 4.16.4.5.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L3 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H10 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L3 EE3
P : 1 + -1 = 0
H11 : is_integer -1
GEq : -1 >= 0
============================
 X1::L3 = EE3
 < LEq: case GEq.

Subgoal 4.16.4.5.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L3 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::(X1::L3)) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::(X1::L3)) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H10 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L3 EE3
P : 1 + -1 = 0
H11 : is_integer -1
LEq : 0 <= -1
============================
 X1::L3 = EE3
 < case LEq.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 L2 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::L2) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::L2) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + N14 = 1
Drop1 : drop N14 L2 EE3
Eq : L2 = EE3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < case Eq.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
NNS+ : length EE3 N11
NNS+3 : names [[]] SNames1
NNS+4 : names EE3 BNames1
NNS+5 : forall X, mem X SNames1 -> mem X BNames1 -> false
Take : 1 + 0 = 1
Drop : 1 + N14 = 1
Drop1 : drop N14 EE3 EE3
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < clear Take
   Drop
   Drop1
   NNS+4
   NNS+3
   NNS+5
   NNS+.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < unfold .

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 exists Names S_P EE_P O_P LV EE1 O1 O2,
   (<evalExpr {P}> FE EE L LV EE1 O1 /\
   (<iterateList {P}> FE EE1 LV X Body EE' O2 /\ O1 ++ O2 = O)) /\
   (names EE Names /\
   (Names |{stmt}- listForeach X L Body ~~> S_P /\
   <evalStmt {P}> FE EE S_P EE_P O_P))
 < exists N1,
   scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))),
   EE',
   O,
   LV,
   EE3,
   O2,
   O3.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 (<evalExpr {P}> FE EE L LV EE3 O2 /\
 (<iterateList {P}> FE EE3 LV X Body EE' O3 /\ O2 ++ O3 = O)) /\
 (names EE N1 /\
 (N1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) /\
 <evalStmt {P}> FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O))
 < split.

Subgoal 4.16.4.5.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 <evalExpr {P}> FE EE L LV EE3 O2
 < search.

Subgoal 4.16.4.5.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 <iterateList {P}> FE EE3 LV X Body EE' O3
 < search.

Subgoal 4.16.4.5.4:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 O2 ++ O3 = O
 < search.

Subgoal 4.16.4.5.5:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 names EE N1
 < search.

Subgoal 4.16.4.5.6:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 N1 |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))
 < search.

Subgoal 4.16.4.5.7:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 <evalStmt {P}> FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O
 < unfold .

Subgoal 4.16.4.5.7:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 exists Scope,
   <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) (Scope::EE') O
 < exists [(SaveL, V')].

Subgoal 4.16.4.5.7:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 <evalStmt {P}> FE ([]::EE) (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) ([(SaveL, V')]::EE') O
 < unfold .

Subgoal 4.16.4.5.7:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O2 /\
   O1 ++ O2 = O)
 < exists [(SaveL, LV)]::EE3,
   O2,
   O3.

Subgoal 4.16.4.5.7:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2 /\
 (<evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3 /\
 O2 ++ O3 = O)
 < split.

Subgoal 4.16.4.5.7.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
 < apply IH to EvE+ A2 _ _ _.

Subgoal 4.16.4.5.7.1:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
H10 : <evalExpr {P}> FE ([]::EE) L LV ([]::EE3) O2
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE3) O2
 < search.

Subgoal 4.16.4.5.7.2:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
 < search.

Subgoal 4.16.4.5.7.3:

Variables: N FE EE EE' O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 SNames1 BNames1 N14
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body EE' O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE3 LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::EE3) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE3) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV ([]::EE3) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV ([]::EE3) O2
============================
 O2 ++ O3 = O
 < search.

Subgoal 4.16.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 **
R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2
Ev : evalExpr FE EE L LV (S1::BR) O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
A3 : acc N3 *
ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3
EvE : evalExpr FE EE L LV (S1::BR) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length (S1::BR) Len
Names3 : names (S1::BR) N5
NS : names_same EE (S1::BR)
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR)
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE (S1::BR) LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS+ : newNameScopes [[]] N11 AR BR
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NSE: apply evalExpr_names_same to _ _ _ EvE.

Subgoal 4.16.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 **
R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2
Ev : evalExpr FE EE L LV (S1::BR) O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
A3 : acc N3 *
ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3
EvE : evalExpr FE EE L LV (S1::BR) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length (S1::BR) Len
Names3 : names (S1::BR) N5
NS : names_same EE (S1::BR)
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR)
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE (S1::BR) LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS+ : newNameScopes [[]] N11 AR BR
NSE : names_same EE (S1::BR)
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < LenBR+: apply names_same_length to NSE LenEE.

Subgoal 4.16.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 **
R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2
Ev : evalExpr FE EE L LV (S1::BR) O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
A3 : acc N3 *
ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3
EvE : evalExpr FE EE L LV (S1::BR) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length (S1::BR) Len
Names3 : names (S1::BR) N5
NS : names_same EE (S1::BR)
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR)
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE (S1::BR) LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS+ : newNameScopes [[]] N11 AR BR
NSE : names_same EE (S1::BR)
LenBR+ : length (S1::BR) N11
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < LenBR: case LenBR+.

Subgoal 4.16.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 **
R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2
Ev : evalExpr FE EE L LV (S1::BR) O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
A3 : acc N3 *
ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3
EvE : evalExpr FE EE L LV (S1::BR) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length (S1::BR) Len
Names3 : names (S1::BR) N5
NS : names_same EE (S1::BR)
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR)
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE (S1::BR) LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS+ : newNameScopes [[]] N11 AR BR
NSE : names_same EE (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = N11
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply length_is to LenBR.

Subgoal 4.16.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 **
R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2
Ev : evalExpr FE EE L LV (S1::BR) O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
A3 : acc N3 *
ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3
EvE : evalExpr FE EE L LV (S1::BR) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length (S1::BR) Len
Names3 : names (S1::BR) N5
NS : names_same EE (S1::BR)
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR)
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE (S1::BR) LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS+ : newNameScopes [[]] N11 AR BR
NSE : names_same EE (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = N11
H10 : is_integer N'
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 4.16.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 **
R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2
Ev : evalExpr FE EE L LV (S1::BR) O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
A3 : acc N3 *
ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3
EvE : evalExpr FE EE L LV (S1::BR) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length (S1::BR) Len
Names3 : names (S1::BR) N5
NS : names_same EE (S1::BR)
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR)
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE (S1::BR) LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS+ : newNameScopes [[]] N11 AR BR
NSE : names_same EE (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = N11
H10 : is_integer N'
L : N' < N11
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < LEq: apply newNameScopes_length to NNS+ LenBR.

Subgoal 4.16.4.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len N5 SNames BNames N9 V' N11 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV (S1::BR) O2 N2 **
R4 : <iterateList {ES}> FE (S1::BR) LV X Body EE' O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV (S1::BR) O2
Ev : evalExpr FE EE L LV (S1::BR) O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
A3 : acc N3 *
ILP : <iterateList {P}> FE (S1::BR) LV X Body EE' O3
EvE : evalExpr FE EE L LV (S1::BR) O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) (S1::BR)
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length (S1::BR) Len
Names3 : names (S1::BR) N5
NS : names_same EE (S1::BR)
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::(S1::BR)) (S1::BR)
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE (S1::BR) LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
NNS' : length EE' Len
NNS'3 : names [[(SaveL, LV)]] SNames
NNS'4 : names EE' BNames
NNS'5 : forall X, mem X SNames -> mem X BNames -> false
ILP'' : <iterateList {P}> FE ([(SaveL, LV)]::(S1::BR)) LV X Body ([(SaveL, LV)]::EE') O3
Fr' : fresh_name "L" (X::N5) SaveL
Plus : 1 + N3 = N9
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::(S1::BR)) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
LenEE : length EE N11
NNS_ : newNameScopes [[]] N11 ([]::EE) EE
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV (S1::AR) O2 N2
EvE+' : evalExpr FE ([]::EE) L LV (S1::AR) O2
NNS+ : newNameScopes [[]] N11 AR BR
NSE : names_same EE (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = N11
H10 : is_integer N'
L : N' < N11
LEq : N11 <= N'
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < apply less_lesseq_flip_false to L LEq.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE3 LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
============================
 <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
 < NSI: apply iterateList_names_same to _ _ _ _ _ IL.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE3 LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE3 (S1::BR)
============================
 <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
 < LenBR+: apply names_same_length to NSI LenEE3.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE3 LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE3 (S1::BR)
LenBR+ : length (S1::BR) Len
============================
 <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
 < LenBR: case LenBR+.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE3 LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE3 (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = Len
============================
 <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
 < apply length_is to LenBR.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE3 LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE3 (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
============================
 <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE3 LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE3 (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
L : N' < Len
============================
 <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
 < LEq: apply newNameScopes_length to NNS' LenBR.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV EE3 O2 O3 Body L X N1 SaveL Len N5 BR S1 AR N'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
R : <evalStmt {ES}> FE EE (listForeach X L Body) (S1::BR) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV EE3 O2 N2 **
R4 : <iterateList {ES}> FE EE3 LV X Body (S1::BR) O3 N3 **
R5 : O2 ++ O3 = O
IsS : is_string X
IsS1 : is_expr L
IsS2 : is_stmt Body
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
L3 : N3 < N
A2 : acc N2 *
H6 : <evalExpr {P}> FE EE L LV EE3 O2
Ev : evalExpr FE EE L LV EE3 O2
H7 : is_value LV
H8 : is_list (is_list (is_pair is_string is_value)) EE3
A3 : acc N3 *
ILP : <iterateList {P}> FE EE3 LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV EE3 O2
IsEE3 : is_list (is_list (is_pair is_string is_value)) EE3
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE3 : length EE3 Len
Names3 : names EE3 N5
NS : names_same EE EE3
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE3) EE3
H9 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE3 LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE3) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE3 (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H10 : is_integer N'
L : N' < Len
LEq : Len <= N'
============================
 <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
 < apply less_lesseq_flip_false to L LEq.

Subgoal 5.1:

Variables: FE X Body EE' Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE' (recVal Fields) X Body EE' [] 0 @@
Acc : acc 0 @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
R1 : lookup Fields "null" trueVal
============================
 <iterateList {P}> FE EE' (recVal Fields) X Body EE' []
 < search.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < case IsV.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < apply lookup_is_value to _ R3.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < apply lookup_is_value to _ R5.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < Ev: apply drop_ext_size_evalStmt to R4.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < IL: apply drop_ext_size_iterateList to R6.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < IsEE3+: apply evalStmt_isCtx to _ _ _ Ev.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < case IsEE3+.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < apply ext_size_is_int_evalStmt to R4.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < apply ext_size_is_int_iterateList to R6.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < apply plus_integer_is_integer to _ _ R1.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < Acc': case Acc (keep).

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < apply ext_size_pos_evalStmt to R4.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < apply ext_size_pos_iterateList to R6.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < assert <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2.

Subgoal 5.2.1:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < Or: apply lt_left to R1 _ _.

Subgoal 5.2.1:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
Or : N2 < N \/ N2 = N
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < L': case Or.

Subgoal 5.2.1.1:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
L' : N2 < N
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < A2: apply Acc' to _ L'.

Subgoal 5.2.1.1:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
L' : N2 < N
A2 : acc N2 *
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < apply IH9 to R4 A2 _ _ _.

Subgoal 5.2.1.1:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
L' : N2 < N
A2 : acc N2 *
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < search.

Subgoal 5.2.1.2:

Variables: N FE EE X Body EE' O N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N
H10 : 0 <= N3
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < apply IH9 to R4 Acc _ _ _.

Subgoal 5.2.1.2:

Variables: N FE EE X Body EE' O N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N
H10 : 0 <= N3
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < search.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < assert <iterateList {P}> FE EE3 Tl X Body EE' O3.

Subgoal 5.2.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < Or: apply lt_right to R1 _ _ _.

Subgoal 5.2.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Or : N3 < N \/ N3 = N
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < L': case Or.

Subgoal 5.2.2.1:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
L' : N3 < N
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < A3: apply Acc' to _ L'.

Subgoal 5.2.2.1:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
L' : N3 < N
A3 : acc N3 *
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < apply IH10 to R6 A3 _ _ _ _ _.

Subgoal 5.2.2.1:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
L' : N3 < N
A3 : acc N3 *
H12 : <iterateList {P}> FE EE3 Tl X Body EE' O3
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < search.

Subgoal 5.2.2.2:

Variables: N FE EE X Body EE' O N2 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < apply IH10 to R6 Acc _ _ _ _ _.

Subgoal 5.2.2.2:

Variables: N FE EE X Body EE' O N2 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H12 : <iterateList {P}> FE EE3 Tl X Body EE' O3
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < search.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
R : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : lookup Fields "null" falseVal
R3 : lookup Fields "head" Hd
R4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R5 : lookup Fields "tail" Tl
R6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R7 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_integer N2
H7 : is_integer N3
H8 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H9 : 0 <= N2
H10 : 0 <= N3
H11 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H12 : <iterateList {P}> FE EE3 Tl X Body EE' O3
============================
 <iterateList {P}> FE EE (recVal Fields) X Body EE' O
 < search.

Subgoal 6.1:

Variables: FE SaveL X Body EE' Names N' Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE')
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE' (recVal Fields) X Body EE' [] 0 @@
Plus : 1 + 0 = N'
Acc : acc N' @
Names : names EE' Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : lookup Fields "null" trueVal
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') []
 < search 20.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < IsFields: case IsV.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < assert <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) [].

Subgoal 6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
============================
 <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
 < search 20.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < assert <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) [].

Subgoal 6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
============================
 <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
 < search 20.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < NEq: assert X = SaveL -> false.

Subgoal 6.2.3:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
============================
 X = SaveL -> false
 < intros E.

Subgoal 6.2.3:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
E : X = SaveL
============================
 false
 < case E.

Subgoal 6.2.3:

Variables: FE SaveL EE Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string SaveL
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) SaveL Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (SaveL::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(SaveL, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl SaveL Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy SaveL (head (name SaveL))) ([(SaveL, Hd)]::([(SaveL, recVal Fields)]::EE)) []
============================
 false
 < apply fresh_name_not_mem to Fr _.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < assert <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [].

Subgoal 6.2.4:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
 < search 20.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < IsSaveL: apply fresh_name_is to _ Fr.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < IsHd: apply lookup_is_value to _ IL3.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < IsTl: apply lookup_is_value to _ IL5.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) ([(SaveL, recVal Fields)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < IsEE: case IsEE.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < LenEE: apply length_exists_list_pair_string_value to IsEE1.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE N1
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < rename N1 to Len.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Acc': case Acc (keep).

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < NNS: assert newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE.

Subgoal 6.2.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
 < unfold .

Subgoal 6.2.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 exists N SNames BNames,
   ((((length EE Len /\ drop N ([(SaveL, Tl)]::EE) EE) /\
   take N ([(SaveL, Tl)]::EE) [[(SaveL, Tl)]]) /\
   names [[(SaveL, Tl)]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveL],
   Names.

Subgoal 6.2.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 ((((length EE Len /\ drop 1 ([(SaveL, Tl)]::EE) EE) /\
 take 1 ([(SaveL, Tl)]::EE) [[(SaveL, Tl)]]) /\
 names [[(SaveL, Tl)]] [SaveL]) /\
 names EE Names) /\
 (forall X, mem X [SaveL] -> mem X Names -> false)
 < split.

Subgoal 6.2.5.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 length EE Len
 < search.

Subgoal 6.2.5.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 drop 1 ([(SaveL, Tl)]::EE) EE
 < search.

Subgoal 6.2.5.3:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 take 1 ([(SaveL, Tl)]::EE) [[(SaveL, Tl)]]
 < search.

Subgoal 6.2.5.4:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 names [[(SaveL, Tl)]] [SaveL]
 < search.

Subgoal 6.2.5.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 names EE Names
 < search.

Subgoal 6.2.5.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
============================
 forall X, mem X [SaveL] -> mem X Names -> false
 < intros ML MN.

Subgoal 6.2.5.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
ML : mem X1 [SaveL]
MN : mem X1 Names
============================
 false
 < ML: case ML.

Subgoal 6.2.5.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
MN : mem SaveL Names
============================
 false
 < apply fresh_name_not_mem to Fr _.

Subgoal 6.2.5.6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
MN : mem X1 Names
ML : mem X1 []
============================
 false
 < case ML.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Ev: apply evalStmt_newNameScopes_exists_ES to _ _ _ _ IL4 NNS.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply ext_size_is_int_iterateList to IL.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < LN: apply lt_plus_one to Plus _.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < EvP: assert <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2.

Subgoal 6.2.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < apply ext_size_is_int_evalStmt to IL4.

Subgoal 6.2.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
H5 : is_integer N2
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < apply ext_size_pos_evalStmt to IL4.

Subgoal 6.2.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
H5 : is_integer N2
H6 : 0 <= N2
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < apply ext_size_pos_iterateList to IL6.

Subgoal 6.2.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
H5 : is_integer N2
H6 : 0 <= N2
H7 : 0 <= N3
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < Or: apply lt_left to IL1 _ _.

Subgoal 6.2.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
H5 : is_integer N2
H6 : 0 <= N2
H7 : 0 <= N3
Or : N2 < N \/ N2 = N
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < L: case Or.

Subgoal 6.2.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
H5 : is_integer N2
H6 : 0 <= N2
H7 : 0 <= N3
L : N2 < N
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < L': apply less_integer_transitive to L LN.

Subgoal 6.2.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
H5 : is_integer N2
H6 : 0 <= N2
H7 : 0 <= N3
L : N2 < N
L' : N2 < N'
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < A2: apply Acc' to _ L'.

Subgoal 6.2.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
H5 : is_integer N2
H6 : 0 <= N2
H7 : 0 <= N3
L : N2 < N
L' : N2 < N'
A2 : acc N2 *
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < apply IH3 to Ev A2 _ _ _.

Subgoal 6.2.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
H5 : is_integer N2
H6 : 0 <= N2
H7 : 0 <= N3
L : N2 < N
L' : N2 < N'
A2 : acc N2 *
H8 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < search.

Subgoal 6.2.6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N
H4 : is_integer N
LN : N < N'
H5 : is_integer N
H6 : 0 <= N
H7 : 0 <= N3
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < A2: apply Acc' to _ LN.

Subgoal 6.2.6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N
H4 : is_integer N
LN : N < N'
H5 : is_integer N
H6 : 0 <= N
H7 : 0 <= N3
A2 : acc N *
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < apply IH3 to Ev A2 _ _ _.

Subgoal 6.2.6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N
H4 : is_integer N
LN : N < N'
H5 : is_integer N
H6 : 0 <= N
H7 : 0 <= N3
A2 : acc N *
H8 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < search.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Ev': apply drop_ext_size_evalStmt to Ev.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < EvB: apply drop_ext_size_evalStmt to IL4.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Eq: assert EE_A' = Scope::([(SaveL, Tl)]::EE3).

Subgoal 6.2.7:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < NNS+: apply evalStmt_newNameScopes to _ _ _ _ Ev' EvB NNS.

Subgoal 6.2.7:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len EE_A' (Scope::EE3)
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < NNS+: case NNS+.

Subgoal 6.2.7.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length (Scope::EE3) Len
NNS+1 : drop N1 EE_A' (Scope::EE3)
NNS+2 : take N1 EE_A' [[(SaveL, Tl)]]
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names (Scope::EE3) BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < IsLen: apply length_is to LenEE.

Subgoal 6.2.7.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length (Scope::EE3) Len
NNS+1 : drop N1 EE_A' (Scope::EE3)
NNS+2 : take N1 EE_A' [[(SaveL, Tl)]]
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names (Scope::EE3) BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
IsLen : is_integer Len
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < P: apply plus_integer_total to _ IsLen with
        N1 = 1.

Subgoal 6.2.7.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames N4
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length (Scope::EE3) Len
NNS+1 : drop N1 EE_A' (Scope::EE3)
NNS+2 : take N1 EE_A' [[(SaveL, Tl)]]
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names (Scope::EE3) BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
IsLen : is_integer Len
P : 1 + Len = N4
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < LenEE+: assert length ([(X, Hd)]::EE) N4.

Subgoal 6.2.7.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames N4
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length (Scope::EE3) Len
NNS+1 : drop N1 EE_A' (Scope::EE3)
NNS+2 : take N1 EE_A' [[(SaveL, Tl)]]
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names (Scope::EE3) BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
IsLen : is_integer Len
P : 1 + Len = N4
LenEE+ : length ([(X, Hd)]::EE) N4
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < LenEE3+: apply evalStmt_keep_scopes to _ _ _ EvB LenEE+.

Subgoal 6.2.7.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames N4
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length (Scope::EE3) Len
NNS+1 : drop N1 EE_A' (Scope::EE3)
NNS+2 : take N1 EE_A' [[(SaveL, Tl)]]
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names (Scope::EE3) BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
IsLen : is_integer Len
P : 1 + Len = N4
LenEE+ : length ([(X, Hd)]::EE) N4
LenEE3+ : length (Scope::EE3) N4
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < apply length_unique to LenEE3+ NNS+.

Subgoal 6.2.7.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length (Scope::EE3) Len
NNS+1 : drop N1 EE_A' (Scope::EE3)
NNS+2 : take N1 EE_A' [[(SaveL, Tl)]]
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names (Scope::EE3) BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
IsLen : is_integer Len
P : 1 + Len = Len
LenEE+ : length ([(X, Hd)]::EE) Len
LenEE3+ : length (Scope::EE3) Len
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < L: apply lt_plus_one to P _.

Subgoal 6.2.7.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A' N1 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length (Scope::EE3) Len
NNS+1 : drop N1 EE_A' (Scope::EE3)
NNS+2 : take N1 EE_A' [[(SaveL, Tl)]]
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names (Scope::EE3) BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
IsLen : is_integer Len
P : 1 + Len = Len
LenEE+ : length ([(X, Hd)]::EE) Len
LenEE3+ : length (Scope::EE3) Len
L : Len < Len
============================
 EE_A' = Scope::([(SaveL, Tl)]::EE3)
 < apply less_integer_not_eq to L.

Subgoal 6.2.7.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len AR
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR EE3
============================
 Scope::AR = Scope::([(SaveL, Tl)]::EE3)
 < NNS+: case NNS+.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len AR N1 SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::AR) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+1 : drop N1 AR EE3
NNS+2 : take N1 AR [[(SaveL, Tl)]]
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
============================
 Scope::AR = Scope::([(SaveL, Tl)]::EE3)
 < Take: case NNS+2.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 SNames BNames N4 L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+1 : drop N1 ([(SaveL, Tl)]::L) EE3
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + N4 = N1
Take1 : take N4 L []
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < case Take1.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 SNames BNames L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+1 : drop N1 ([(SaveL, Tl)]::L) EE3
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = N1
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < compute Take.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+1 : drop 1 ([(SaveL, Tl)]::L) EE3
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < Drop: case NNS+1.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N5 = 1
Drop1 : drop N5 L EE3
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < apply drop_is_integer to Drop1.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L N5
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + N5 = 1
Drop1 : drop N5 L EE3
H5 : is_integer N5
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L EE3
H5 : is_integer 0
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < Eq: assert L = EE3.

Subgoal 6.2.7.2.1.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L EE3
H5 : is_integer 0
============================
 L = EE3
 < Drop': case Drop1.

Subgoal 6.2.7.2.1.1.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
============================
 EE3 = EE3
 < search.

Subgoal 6.2.7.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames N6 L1 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
Drop' : 1 + N6 = 0
Drop'1 : drop N6 L1 EE3
============================
 X1::L1 = EE3
 < GEq: apply drop_geq_0 to Drop'1.

Subgoal 6.2.7.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames N6 L1 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
Drop' : 1 + N6 = 0
Drop'1 : drop N6 L1 EE3
GEq : N6 >= 0
============================
 X1::L1 = EE3
 < P: assert 1 + -1 = 0.

Subgoal 6.2.7.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames N6 L1 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
Drop' : 1 + N6 = 0
Drop'1 : drop N6 L1 EE3
GEq : N6 >= 0
P : 1 + -1 = 0
============================
 X1::L1 = EE3
 < apply drop_is_integer to Drop'1.

Subgoal 6.2.7.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames N6 L1 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
Drop' : 1 + N6 = 0
Drop'1 : drop N6 L1 EE3
GEq : N6 >= 0
P : 1 + -1 = 0
H6 : is_integer N6
============================
 X1::L1 = EE3
 < apply plus_integer_unique_addend to _ _ _ P Drop'.

Subgoal 6.2.7.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L1 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE3
GEq : -1 >= 0
P : 1 + -1 = 0
H6 : is_integer -1
============================
 X1::L1 = EE3
 < LEq: case GEq.

Subgoal 6.2.7.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L1 X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::(X1::L1))) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
H5 : is_integer 0
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE3
P : 1 + -1 = 0
H6 : is_integer -1
LEq : 0 <= -1
============================
 X1::L1 = EE3
 < case LEq.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames L
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::L)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 L EE3
H5 : is_integer 0
Eq : L = EE3
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < case Eq.

Subgoal 6.2.7.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len SNames BNames
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
NNS+ : length EE3 Len
NNS+3 : names [[(SaveL, Tl)]] SNames
NNS+4 : names EE3 BNames
NNS+5 : forall X, mem X SNames -> mem X BNames -> false
Take : 1 + 0 = 1
Drop : 1 + 0 = 1
Drop1 : drop 0 EE3 EE3
H5 : is_integer 0
============================
 Scope::([(SaveL, Tl)]::EE3) = Scope::([(SaveL, Tl)]::EE3)
 < search.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < IsLen: apply length_is to LenEE.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < P: apply plus_integer_total to _ IsLen with
        N1 = 1.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
P : 1 + Len = N1
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < LenEE+: assert length ([(X, Hd)]::EE) N1.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
P : 1 + Len = N1
LenEE+ : length ([(X, Hd)]::EE) N1
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < LenBR++: apply evalStmt_keep_scopes to _ _ _ EvB LenEE+.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
P : 1 + Len = N1
LenEE+ : length ([(X, Hd)]::EE) N1
LenBR++ : length (Scope::(S::BR)) N1
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < LenBR+: case LenBR++.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
P : 1 + Len = N1
LenEE+ : length ([(X, Hd)]::EE) N1
LenBR+ : length (S::BR) N'1
LenBR+1 : 1 + N'1 = N1
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < apply length_is to LenBR+.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
P : 1 + Len = N1
LenEE+ : length ([(X, Hd)]::EE) N1
LenBR+ : length (S::BR) N'1
LenBR+1 : 1 + N'1 = N1
H5 : is_integer N'1
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < LenBR: case LenBR+.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
P : 1 + Len = N1
LenEE+ : length ([(X, Hd)]::EE) N1
LenBR+1 : 1 + N'1 = N1
H5 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < apply length_is to LenBR.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
P : 1 + Len = N1
LenEE+ : length ([(X, Hd)]::EE) N1
LenBR+1 : 1 + N'1 = N1
H5 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
H6 : is_integer N'2
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < LEq: apply newNameScopes_length to NNS+ LenBR.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields Len BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] Len AR1 BR
IsLen : is_integer Len
P : 1 + Len = N1
LenEE+ : length ([(X, Hd)]::EE) N1
LenBR+1 : 1 + N'1 = N1
H5 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
H6 : is_integer N'2
LEq : Len <= N'2
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < apply plus_integer_unique_addend to _ _ _ P LenBR+1.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE N'1
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] N'1 ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] N'1 AR1 BR
IsLen : is_integer N'1
P : 1 + N'1 = N1
LenEE+ : length ([(X, Hd)]::EE) N1
LenBR+1 : 1 + N'1 = N1
H5 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
H6 : is_integer N'2
LEq : N'1 <= N'2
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < L: apply lt_plus_one to LenBR1 _.

Subgoal 6.2.7.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope O2 Tl O3 Fields BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE N'1
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] N'1 ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::(S::AR1)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2
NNS+ : newNameScopes [[(SaveL, Tl)]] N'1 AR1 BR
IsLen : is_integer N'1
P : 1 + N'1 = N1
LenEE+ : length ([(X, Hd)]::EE) N1
LenBR+1 : 1 + N'1 = N1
H5 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
H6 : is_integer N'2
LEq : N'1 <= N'2
L : N'2 < N'1
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < apply less_lesseq_flip_false to L LEq.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len EE_A'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Eq : EE_A' = Scope::([(SaveL, Tl)]::EE3)
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < case Eq.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Is': apply evalStmt_isCtx to _ _ _ Ev'.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_list (is_pair is_string is_value)) (Scope::([(SaveL, Tl)]::EE3))
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Is': case Is'.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3)
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < IsN3: apply ext_size_is_int_iterateList to IL6.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3)
IsN3 : is_integer N3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply ext_size_pos_iterateList to IL6.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3)
IsN3 : is_integer N3
H5 : 0 <= N3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < P: apply plus_integer_total to _ IsN3 with
        N1 = 1.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3)
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply lesseq_integer__add_positive to _ _ P with
     Base = 0.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3)
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply ext_size_pos_evalStmt to IL4.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
Is'1 : is_list (is_list (is_pair is_string is_value)) ([(SaveL, Tl)]::EE3)
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Is'': case Is'1.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < N: apply names_exists to Is''1.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 N4
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE3
N : names EE3 N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply names_is to _ N.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 N4
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE3
N : names EE3 N4
H8 : is_list is_string N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Fr': apply fresh_name_exists to _ _ with
          Base = "L" Names = X::N4.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd Scope EE3 O2 Tl O3 Fields Len N1 N4 F
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope::([(SaveL, Tl)]::EE3)) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
Is' : is_list (is_pair is_string is_value) Scope
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE3
N : names EE3 N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < NS: apply evalStmt_names_same to _ _ _ EvB.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply fresh_name_unique_mems to Fr' Fr _ _.

Subgoal 6.2.8:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 forall X1, mem X1 (X::Names) -> mem X1 (X::N4)
 < intros M.

Subgoal 6.2.8:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 (X::Names)
============================
 mem X1 (X::N4)
 < M: case M.

Subgoal 6.2.8.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 mem X (X::N4)
 < search.

Subgoal 6.2.8.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 Names
============================
 mem X1 (X::N4)
 < apply names_same_names to NS Names N M.

Subgoal 6.2.8.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 Names
H9 : mem X1 N4
============================
 mem X1 (X::N4)
 < search.

Subgoal 6.2.9:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 forall X1, mem X1 (X::N4) -> mem X1 (X::Names)
 < intros M.

Subgoal 6.2.9:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 (X::N4)
============================
 mem X1 (X::Names)
 < M: case M.

Subgoal 6.2.9.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 mem X (X::Names)
 < search.

Subgoal 6.2.9.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 N4
============================
 mem X1 (X::Names)
 < NS': apply names_same_symmetric to NS.

Subgoal 6.2.9.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 N4
NS' : names_same EE'' EE
============================
 mem X1 (X::Names)
 < apply names_same_names to NS' N Names M.

Subgoal 6.2.9.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 N4
NS' : names_same EE'' EE
H9 : mem X1 Names
============================
 mem X1 (X::Names)
 < search.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Or: apply lt_right to IL1 _ _ _.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
Or : N3 < N \/ N3 = N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < L: case Or.

Subgoal 6.2.10:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < LEq: apply less_integer_step_lesseq to _ _ L P.

Subgoal 6.2.10:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N1 <= N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < Or: apply lesseq_integer_less_or_eq to LEq.

Subgoal 6.2.10:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N1 <= N
Or : N1 < N \/ N1 = N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < L': case Or.

Subgoal 6.2.10.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N1 <= N
L' : N1 < N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < L'': apply less_integer_transitive to L' LN.

Subgoal 6.2.10.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N1 <= N
L' : N1 < N
L'' : N1 < N'
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < A: apply Acc' to _ L''.

Subgoal 6.2.10.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N1 <= N
L' : N1 < N
L'' : N1 < N'
A : acc N1 *
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply IH_IL_W to _ _ _ _ _ IL6 P A N Fr'.

Subgoal 6.2.10.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' V'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N1 <= N
L' : N1 < N
L'' : N1 < N'
A : acc N1 *
H9 : <evalStmt {P}> FE ([(SaveL, Tl)]::EE'') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < search.

Subgoal 6.2.10.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N
H6 : 0 <= N
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N <= N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < A: apply Acc' to _ LN.

Subgoal 6.2.10.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N
H6 : 0 <= N
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N <= N
A : acc N *
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply IH_IL_W to _ _ _ _ _ IL6 P A N Fr'.

Subgoal 6.2.10.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Hd O2 Tl O3 Fields Len N4 Scope' EE'' V'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N3 = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N3
H5 : 0 <= N3
P : 1 + N3 = N
H6 : 0 <= N
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
L : N3 < N
LEq : N <= N
A : acc N *
H9 : <evalStmt {P}> FE ([(SaveL, Tl)]::EE'') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < search.

Subgoal 6.2.11:

Variables: FE SaveL EE X Body EE' O Names N N' N2 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE''
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N
H5 : 0 <= N
P : 1 + N = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < apply IH_IL_W to _ _ _ _ _ IL6 Plus Acc N Fr'.

Subgoal 6.2.11:

Variables: FE SaveL EE X Body EE' O Names N N' N2 Hd O2 Tl O3 Fields Len N1 N4 Scope' EE'' V'
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH7 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH8 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (recVal Fields) X Body EE' O N @@
Plus : 1 + N = N'
Acc : acc N' @
Names : names EE Names
Fr : fresh_name "L" (X::Names) SaveL
IL1 : N2 + N = N
IL2 : lookup Fields "null" falseVal
IL3 : lookup Fields "head" Hd
IL4 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL5 : lookup Fields "tail" Tl
IL6 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N **
IL7 : O2 ++ O3 = O
IsFields : is_list (is_pair is_string is_value) Fields
H1 : <evalExpr {P}> FE ([(SaveL, recVal Fields)]::EE) (not (null (name SaveL))) trueVal ([(SaveL, recVal Fields)]::EE) []
H2 : <evalStmt {P}> FE ([]::([(SaveL, recVal Fields)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) []
NEq : X = SaveL -> false
H3 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, recVal Fields)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsHd : is_value Hd
IsTl : is_value Tl
IsEE : is_list (is_pair is_string is_value) [(SaveL, recVal Fields)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
Acc' : forall M, 0 <= M -> M < N' -> acc M *
NNS : newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
Ev : <evalStmt {ES}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2 N2
H4 : is_integer N
LN : N < N'
EvP : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
Ev' : evalStmt FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body (Scope'::([(SaveL, Tl)]::EE'')) O2
EvB : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2
Is' : is_list (is_pair is_string is_value) Scope'
IsN3 : is_integer N
H5 : 0 <= N
P : 1 + N = N1
H6 : 0 <= N1
H7 : 0 <= N2
Is'' : is_list (is_pair is_string is_value) [(SaveL, Tl)]
Is''1 : is_list (is_list (is_pair is_string is_value)) EE''
N : names EE'' N4
H8 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
H9 : <evalStmt {P}> FE ([(SaveL, Tl)]::EE'') (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, recVal Fields)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
 < search.

Proof completed.
 < Prove exactEval:host:paramName_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_paramName_forward.

Proof completed.
 < Prove_Constraint exactEval:host:proj_paramName_back.

Proof completed.
 < Prove exactEval:host:getFunEvalInfo_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_getFunEvalInfo_forward.

Proof completed.
 < Prove_Constraint exactEval:host:proj_getFunEvalInfo_back.

Proof completed.
 < Prove exactEval:host:evalProgram_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalProgram_forward.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalProgram_back.

Proof completed.
 < Theorem listIndex_typePres :
     forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V -> valueType V Ty.

============================
 forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V -> valueType V Ty
 < induction on 2.

IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
============================
 forall L Ty I V, valueType L (listTy Ty) -> listIndex L I V @ -> valueType V Ty
 < intros VT LI.

Variables: L Ty I V
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType L (listTy Ty)
LI : listIndex L I V @
============================
 valueType V Ty
 < LI: case LI.

Subgoal 1:

Variables: Ty V Fields
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType (recVal Fields) (listTy Ty)
LI : lookup Fields "head" V
============================
 valueType V Ty
 < VT: case VT.

Subgoal 1.1:

Variables: Ty V V1
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : lookup [("null", V1)] "head" V
VT : valueType V1 boolTy
============================
 valueType V Ty
 < L: case LI.

Subgoal 1.1:

Variables: Ty V V1
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType V1 boolTy
L : "null" = "head" -> false
L1 : lookup [] "head" V
============================
 valueType V Ty
 < case L1.

Subgoal 1.2:

Variables: Ty V TV HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" V
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
============================
 valueType V Ty
 < L: case LI.

Subgoal 1.2:

Variables: Ty V TV HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "head" -> false
L1 : lookup [("head", HV), ("tail", TV)] "head" V
============================
 valueType V Ty
 < L: case L1.

Subgoal 1.2.1:

Variables: Ty V TV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType NV boolTy
VT1 : valueType V Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "head" -> false
============================
 valueType V Ty
 < search.

Subgoal 1.2.2:

Variables: Ty V TV HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "head" -> false
L1 : "head" = "head" -> false
L2 : lookup [("tail", TV)] "head" V
============================
 valueType V Ty
 < apply L1 to _.

Subgoal 2:

Variables: Ty I V I1 Tl Fields
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType (recVal Fields) (listTy Ty)
LI : I - 1 = I1
LI1 : lookup Fields "tail" Tl
LI2 : listIndex Tl I1 V *
============================
 valueType V Ty
 < VT: case VT.

Subgoal 2.1:

Variables: Ty I V I1 Tl V1
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI1 : lookup [("null", V1)] "tail" Tl
LI2 : listIndex Tl I1 V *
VT : valueType V1 boolTy
============================
 valueType V Ty
 < L: case LI1.

Subgoal 2.1:

Variables: Ty I V I1 Tl V1
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI2 : listIndex Tl I1 V *
VT : valueType V1 boolTy
L : "null" = "tail" -> false
L1 : lookup [] "tail" Tl
============================
 valueType V Ty
 < case L1.

Subgoal 2.2:

Variables: Ty I V I1 Tl TV HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl
LI2 : listIndex Tl I1 V *
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
============================
 valueType V Ty
 < L: case LI1.

Subgoal 2.2:

Variables: Ty I V I1 Tl TV HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI2 : listIndex Tl I1 V *
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "tail" -> false
L1 : lookup [("head", HV), ("tail", TV)] "tail" Tl
============================
 valueType V Ty
 < L: case L1.

Subgoal 2.2:

Variables: Ty I V I1 Tl TV HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI2 : listIndex Tl I1 V *
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
L2 : lookup [("tail", TV)] "tail" Tl
============================
 valueType V Ty
 < L: case L2.

Subgoal 2.2.1:

Variables: Ty I V I1 Tl HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI2 : listIndex Tl I1 V *
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType Tl (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
============================
 valueType V Ty
 < apply IH to _ LI2.

Subgoal 2.2.1:

Variables: Ty I V I1 Tl HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI2 : listIndex Tl I1 V *
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType Tl (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
H1 : valueType V Ty
============================
 valueType V Ty
 < search.

Subgoal 2.2.2:

Variables: Ty I V I1 Tl TV HV NV
IH : forall L Ty I V,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI2 : listIndex Tl I1 V *
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
L2 : "tail" = "tail" -> false
L3 : lookup [] "tail" Tl
============================
 valueType V Ty
 < apply L2 to _.

Proof completed.
 < Theorem updateListIndex_typePres :
     forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out ->
       valueType Out (listTy Ty).

============================
 forall L Ty I V Out,
   valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out -> valueType Out (listTy Ty)
 < induction on 3.

IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
============================
 forall L Ty I V Out,
   valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out @ -> valueType Out (listTy Ty)
 < intros VTL VTV ULI.

Variables: L Ty I V Out
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTL : valueType L (listTy Ty)
VTV : valueType V Ty
ULI : updateListIndex L I V Out @
============================
 valueType Out (listTy Ty)
 < ULI: case ULI.

Subgoal 1:

Variables: Ty V NewFields Fields
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTL : valueType (recVal Fields) (listTy Ty)
VTV : valueType V Ty
ULI : lookup Fields "null" falseVal
ULI1 : replaceRecVal "head" V Fields NewFields
============================
 valueType (recVal NewFields) (listTy Ty)
 < VTL: case VTL.

Subgoal 1.1:

Variables: Ty V NewFields V1
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", V1)] "null" falseVal
ULI1 : replaceRecVal "head" V [("null", V1)] NewFields
VTL : valueType V1 boolTy
============================
 valueType (recVal NewFields) (listTy Ty)
 < R: case ULI1.

Subgoal 1.1:

Variables: Ty V V1 RRest
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", V1)] "null" falseVal
VTL : valueType V1 boolTy
R : "head" = "null" -> false
R1 : replaceRecVal "head" V [] RRest
============================
 valueType (recVal (("null", V1)::RRest)) (listTy Ty)
 < case R1.

Subgoal 1.2:

Variables: Ty V NewFields TV HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
ULI1 : replaceRecVal "head" V [("null", NV), ("head", HV), ("tail", TV)] NewFields
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType TV (listTy Ty)
============================
 valueType (recVal NewFields) (listTy Ty)
 < R: case ULI1.

Subgoal 1.2:

Variables: Ty V TV HV NV RRest
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType TV (listTy Ty)
R : "head" = "null" -> false
R1 : replaceRecVal "head" V [("head", HV), ("tail", TV)] RRest
============================
 valueType (recVal (("null", NV)::RRest)) (listTy Ty)
 < R: case R1.

Subgoal 1.2.1:

Variables: Ty V TV HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType TV (listTy Ty)
R : "head" = "null" -> false
============================
 valueType (recVal [("null", NV), ("head", V), ("tail", TV)]) (listTy Ty)
 < search.

Subgoal 1.2.2:

Variables: Ty V TV HV NV RRest1
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType TV (listTy Ty)
R : "head" = "null" -> false
R1 : "head" = "head" -> false
R2 : replaceRecVal "head" V [("tail", TV)] RRest1
============================
 valueType (recVal (("null", NV)::(("head", HV)::RRest1))) (listTy Ty)
 < apply R1 to _.

Subgoal 2:

Variables: Ty I V I1 Tl TlNew NewFields Fields
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTL : valueType (recVal Fields) (listTy Ty)
VTV : valueType V Ty
ULI : lookup Fields "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup Fields "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew Fields NewFields
============================
 valueType (recVal NewFields) (listTy Ty)
 < VTL: case VTL.

Subgoal 2.1:

Variables: Ty I V I1 Tl TlNew NewFields V1
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", V1)] "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup [("null", V1)] "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew [("null", V1)] NewFields
VTL : valueType V1 boolTy
============================
 valueType (recVal NewFields) (listTy Ty)
 < L: case ULI2.

Subgoal 2.1:

Variables: Ty I V I1 Tl TlNew NewFields V1
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", V1)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew [("null", V1)] NewFields
VTL : valueType V1 boolTy
L : "null" = "tail" -> false
L1 : lookup [] "tail" Tl
============================
 valueType (recVal NewFields) (listTy Ty)
 < case L1.

Subgoal 2.2:

Variables: Ty I V I1 Tl TlNew NewFields TV HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
ULI1 : I - 1 = I1
ULI2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", TV)] NewFields
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType TV (listTy Ty)
============================
 valueType (recVal NewFields) (listTy Ty)
 < L: case ULI2.

Subgoal 2.2:

Variables: Ty I V I1 Tl TlNew NewFields TV HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", TV)] NewFields
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType TV (listTy Ty)
L : "null" = "tail" -> false
L1 : lookup [("head", HV), ("tail", TV)] "tail" Tl
============================
 valueType (recVal NewFields) (listTy Ty)
 < L: case L1.

Subgoal 2.2:

Variables: Ty I V I1 Tl TlNew NewFields TV HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", TV)] NewFields
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType TV (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
L2 : lookup [("tail", TV)] "tail" Tl
============================
 valueType (recVal NewFields) (listTy Ty)
 < L: case L2.

Subgoal 2.2.1:

Variables: Ty I V I1 Tl TlNew NewFields HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", Tl)] NewFields
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType Tl (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
============================
 valueType (recVal NewFields) (listTy Ty)
 < apply IH to _ _ ULI3.

Subgoal 2.2.1:

Variables: Ty I V I1 Tl TlNew NewFields HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", Tl)] NewFields
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType Tl (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
H1 : valueType TlNew (listTy Ty)
============================
 valueType (recVal NewFields) (listTy Ty)
 < R: case ULI4.

Subgoal 2.2.1:

Variables: Ty I V I1 Tl TlNew HV NV RRest
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType Tl (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
H1 : valueType TlNew (listTy Ty)
R : "tail" = "null" -> false
R1 : replaceRecVal "tail" TlNew [("head", HV), ("tail", Tl)] RRest
============================
 valueType (recVal (("null", NV)::RRest)) (listTy Ty)
 < R: case R1.

Subgoal 2.2.1:

Variables: Ty I V I1 Tl TlNew HV NV RRest1
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType Tl (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
H1 : valueType TlNew (listTy Ty)
R : "tail" = "null" -> false
R1 : "tail" = "head" -> false
R2 : replaceRecVal "tail" TlNew [("tail", Tl)] RRest1
============================
 valueType (recVal (("null", NV)::(("head", HV)::RRest1))) (listTy Ty)
 < R: case R2.

Subgoal 2.2.1.1:

Variables: Ty I V I1 Tl TlNew HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType Tl (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
H1 : valueType TlNew (listTy Ty)
R : "tail" = "null" -> false
R1 : "tail" = "head" -> false
============================
 valueType (recVal [("null", NV), ("head", HV), ("tail", TlNew)]) (listTy Ty)
 < search.

Subgoal 2.2.1.2:

Variables: Ty I V I1 Tl TlNew HV NV RRest2
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType Tl (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
H1 : valueType TlNew (listTy Ty)
R : "tail" = "null" -> false
R1 : "tail" = "head" -> false
R2 : "tail" = "tail" -> false
R3 : replaceRecVal "tail" TlNew [] RRest2
============================
 valueType (recVal (("null", NV)::(("head", HV)::(("tail", Tl)::RRest2)))) (listTy Ty)
 < apply R2 to _.

Subgoal 2.2.2:

Variables: Ty I V I1 Tl TlNew NewFields TV HV NV
IH : forall L Ty I V Out,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * ->
       valueType Out (listTy Ty)
VTV : valueType V Ty
ULI : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
ULI1 : I - 1 = I1
ULI3 : updateListIndex Tl I1 V TlNew *
ULI4 : replaceRecVal "tail" TlNew [("null", NV), ("head", HV), ("tail", TV)] NewFields
VTL : valueType NV boolTy
VTL1 : valueType HV Ty
VTL2 : valueType TV (listTy Ty)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
L2 : "tail" = "tail" -> false
L3 : lookup [] "tail" Tl
============================
 valueType (recVal NewFields) (listTy Ty)
 < apply L2 to _.

Proof completed.
 < Prove exactEval:host:evalExpr_typePres_ctx,
         exactEval:host:evalExpr_typePres,
         exactEval:host:evalStmt_typePres,
         exactEval:host:evalArgs_typePres_Ctx,
         exactEval:host:evalArgs_typePres,
         exactEval:host:evalRecFields_typePres_Ctx,
         exactEval:host:evalRecFields_typePres
   with
      iterateList_typePres : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         IsET : is_list (is_list (is_pair is_string is_typ)) ET ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsEE : is_list (is_list (is_pair is_string is_value)) EE ->
         Ty : stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
         VTy : valueType V (listTy Ty) ->
         IsTy : is_typ Ty ->
         IL : iterateList FE EE V X Body EE' O ->
         Funs : (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, RVVal, ArgNames, Body) ->
           exists Scope TyEnv',
             (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
             stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') ->
         Ctxs : related_all_scopes ET EE ->
         related_all_scopes ET' EE'
      on IL as IH_IL.

Subgoal 1.27:

Variables: FT ET Ty FE EE' Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (nil Ty1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ty : typeOf FT ET (nil Ty1) Ty
Ev : evalExpr FE EE' (nil Ty1) (recVal [("null", trueVal)]) EE' [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Subgoal 1.28:

Variables: FT ET Ty FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (cons E1 E2)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (cons E1 E2) Ty
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 related_all_scopes ET EE'
 < case IsE.

Subgoal 1.28:

Variables: FT ET Ty FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (cons E1 E2) Ty
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 related_all_scopes ET EE'
 < Ty: case Ty.

Subgoal 1.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
============================
 related_all_scopes ET EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 1.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
H3 : related_all_scopes ET EE3
============================
 related_all_scopes ET EE'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
H3 : related_all_scopes ET EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 related_all_scopes ET EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev2 _ _.

Subgoal 1.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
H3 : related_all_scopes ET EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Subgoal 1.29:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (head E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (head E1) Ty
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
============================
 related_all_scopes ET EE'
 < case IsE.

Subgoal 1.29:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (head E1) Ty
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
============================
 related_all_scopes ET EE'
 < Ty: case Ty.

Subgoal 1.29:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
============================
 related_all_scopes ET EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 1.29:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
H2 : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Subgoal 1.30:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (tail E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (tail E1) Ty
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
============================
 related_all_scopes ET EE'
 < case IsE.

Subgoal 1.30:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (tail E1) Ty
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 related_all_scopes ET EE'
 < Ty: case Ty.

Subgoal 1.30:

Variables: FT ET FE EE EE' O V Fields E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
============================
 related_all_scopes ET EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 1.30:

Variables: FT ET FE EE EE' O V Fields E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
H2 : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Subgoal 1.31:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (null E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (null E1) Ty
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
============================
 related_all_scopes ET EE'
 < case IsE.

Subgoal 1.31:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (null E1) Ty
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
============================
 related_all_scopes ET EE'
 < Ty: case Ty.

Subgoal 1.31:

Variables: FT ET FE EE EE' O V Fields E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
============================
 related_all_scopes ET EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 1.31:

Variables: FT ET FE EE EE' O V Fields E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
H2 : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Subgoal 1.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (index L I)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (index L I) Ty
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 related_all_scopes ET EE'
 < case IsE.

Subgoal 1.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (index L I) Ty
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 related_all_scopes ET EE'
 < Ty: case Ty.

Subgoal 1.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ty : typeOf FT ET L (listTy Ty)
Ty1 : typeOf FT ET I intTy
============================
 related_all_scopes ET EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 1.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ty : typeOf FT ET L (listTy Ty)
Ty1 : typeOf FT ET I intTy
H3 : related_all_scopes ET EE3
============================
 related_all_scopes ET EE'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ty : typeOf FT ET L (listTy Ty)
Ty1 : typeOf FT ET I intTy
H3 : related_all_scopes ET EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 related_all_scopes ET EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev2 _ _.

Subgoal 1.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ty : typeOf FT ET L (listTy Ty)
Ty1 : typeOf FT ET I intTy
H3 : related_all_scopes ET EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Subgoal 1.33:

Variables: FT ET Ty FE EE EE' O V1 I E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (exactEval:list:length E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (exactEval:list:length E1) Ty
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
============================
 related_all_scopes ET EE'
 < case IsE.

Subgoal 1.33:

Variables: FT ET Ty FE EE EE' O V1 I E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (exactEval:list:length E1) Ty
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
============================
 related_all_scopes ET EE'
 < Ty: case Ty.

Subgoal 1.33:

Variables: FT ET FE EE EE' O V1 I E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
============================
 related_all_scopes ET EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 1.33:

Variables: FT ET FE EE EE' O V1 I E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
H2 : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Subgoal 2.27:

Variables: FT ET Ty FE EE' Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (nil Ty1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ty : typeOf FT ET (nil Ty1) Ty
Ev : evalExpr FE EE' (nil Ty1) (recVal [("null", trueVal)]) EE' [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE'
============================
 valueType (recVal [("null", trueVal)]) Ty
 < case Ty.

Subgoal 2.27:

Variables: FT ET FE EE' Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (nil Ty1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ev : evalExpr FE EE' (nil Ty1) (recVal [("null", trueVal)]) EE' [] @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE'
============================
 valueType (recVal [("null", trueVal)]) (listTy Ty1)
 < search.

Subgoal 2.28:

Variables: FT ET Ty FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (cons E1 E2)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (cons E1 E2) Ty
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) Ty
 < case IsE.

Subgoal 2.28:

Variables: FT ET Ty FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (cons E1 E2) Ty
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) Ty
 < Ty: case Ty.

Subgoal 2.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
============================
 valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 2.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
H3 : related_all_scopes ET EE3
============================
 valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
H3 : related_all_scopes ET EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
 < apply IH_T_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 2.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
H3 : related_all_scopes ET EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : valueType V1 Ty1
============================
 valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
 < apply IH_T_E to _ _ _ _ _ _ Ev2 _ _.

Subgoal 2.28:

Variables: FT ET FE EE EE' O EE3 O2 O3 V2 V1 E2 E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Ty : typeOf FT ET E1 Ty1
Ty1 : typeOf FT ET E2 (listTy Ty1)
H3 : related_all_scopes ET EE3
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : valueType V1 Ty1
H6 : valueType V2 (listTy Ty1)
============================
 valueType (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) (listTy Ty1)
 < search.

Subgoal 2.29:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (head E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (head E1) Ty
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
============================
 valueType V Ty
 < case IsE.

Subgoal 2.29:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (head E1) Ty
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
============================
 valueType V Ty
 < Ty: case Ty.

Subgoal 2.29:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
============================
 valueType V Ty
 < VT: apply IH_T_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 2.29:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
VT : valueType (recVal Fields) (listTy Ty)
============================
 valueType V Ty
 < VT: case VT.

Subgoal 2.29.1:

Variables: FT ET Ty FE EE EE' O V E1 V1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O *
Ev2 : lookup [("null", V1)] "head" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
VT : valueType V1 boolTy
============================
 valueType V Ty
 < L: case Ev2.

Subgoal 2.29.1:

Variables: FT ET Ty FE EE EE' O V E1 V1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
VT : valueType V1 boolTy
L : "null" = "head" -> false
L1 : lookup [] "head" V
============================
 valueType V Ty
 < case L1.

Subgoal 2.29.2:

Variables: FT ET Ty FE EE EE' O V E1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
Ev2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
============================
 valueType V Ty
 < L: case Ev2.

Subgoal 2.29.2:

Variables: FT ET Ty FE EE EE' O V E1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "head" -> false
L1 : lookup [("head", HV), ("tail", TV)] "head" V
============================
 valueType V Ty
 < L: case L1.

Subgoal 2.29.2.1:

Variables: FT ET Ty FE EE EE' O V E1 TV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", V), ("tail", TV)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
VT : valueType NV boolTy
VT1 : valueType V Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "head" -> false
============================
 valueType V Ty
 < search.

Subgoal 2.29.2.2:

Variables: FT ET Ty FE EE EE' O V E1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
VT : valueType NV boolTy
VT1 : valueType HV Ty
VT2 : valueType TV (listTy Ty)
L : "null" = "head" -> false
L1 : "head" = "head" -> false
L2 : lookup [("tail", TV)] "head" V
============================
 valueType V Ty
 < apply L1 to _.

Subgoal 2.30:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (tail E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (tail E1) Ty
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
============================
 valueType V Ty
 < case IsE.

Subgoal 2.30:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (tail E1) Ty
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 valueType V Ty
 < Ty: case Ty.

Subgoal 2.30:

Variables: FT ET FE EE EE' O V Fields E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
============================
 valueType V (listTy Ty1)
 < VT: apply IH_T_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 2.30:

Variables: FT ET FE EE EE' O V Fields E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType (recVal Fields) (listTy Ty1)
============================
 valueType V (listTy Ty1)
 < VT: case VT.

Subgoal 2.30.1:

Variables: FT ET FE EE EE' O V E1 Ty1 V1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O *
Ev2 : lookup [("null", V1)] "tail" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType V1 boolTy
============================
 valueType V (listTy Ty1)
 < L: case Ev2.

Subgoal 2.30.1:

Variables: FT ET FE EE EE' O V E1 Ty1 V1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType V1 boolTy
L : "null" = "tail" -> false
L1 : lookup [] "tail" V
============================
 valueType V (listTy Ty1)
 < case L1.

Subgoal 2.30.2:

Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
Ev2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType NV boolTy
VT1 : valueType HV Ty1
VT2 : valueType TV (listTy Ty1)
============================
 valueType V (listTy Ty1)
 < L: case Ev2.

Subgoal 2.30.2:

Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType NV boolTy
VT1 : valueType HV Ty1
VT2 : valueType TV (listTy Ty1)
L : "null" = "tail" -> false
L1 : lookup [("head", HV), ("tail", TV)] "tail" V
============================
 valueType V (listTy Ty1)
 < L: case L1.

Subgoal 2.30.2:

Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType NV boolTy
VT1 : valueType HV Ty1
VT2 : valueType TV (listTy Ty1)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
L2 : lookup [("tail", TV)] "tail" V
============================
 valueType V (listTy Ty1)
 < L: case L2.

Subgoal 2.30.2.1:

Variables: FT ET FE EE EE' O V E1 Ty1 HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", V)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType NV boolTy
VT1 : valueType HV Ty1
VT2 : valueType V (listTy Ty1)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
============================
 valueType V (listTy Ty1)
 < search.

Subgoal 2.30.2.2:

Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType NV boolTy
VT1 : valueType HV Ty1
VT2 : valueType TV (listTy Ty1)
L : "null" = "tail" -> false
L1 : "head" = "tail" -> false
L2 : "tail" = "tail" -> false
L3 : lookup [] "tail" V
============================
 valueType V (listTy Ty1)
 < apply L2 to _.

Subgoal 2.31:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (null E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (null E1) Ty
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
============================
 valueType V Ty
 < case IsE.

Subgoal 2.31:

Variables: FT ET Ty FE EE EE' O V Fields E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (null E1) Ty
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
============================
 valueType V Ty
 < Ty: case Ty.

Subgoal 2.31:

Variables: FT ET FE EE EE' O V Fields E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
============================
 valueType V boolTy
 < VT: apply IH_T_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 2.31:

Variables: FT ET FE EE EE' O V Fields E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType (recVal Fields) (listTy Ty1)
============================
 valueType V boolTy
 < VT: case VT.

Subgoal 2.31.1:

Variables: FT ET FE EE EE' O V E1 Ty1 V1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O *
Ev2 : lookup [("null", V1)] "null" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType V1 boolTy
============================
 valueType V boolTy
 < L: case Ev2.

Subgoal 2.31.1.1:

Variables: FT ET FE EE EE' O V E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", V)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType V boolTy
============================
 valueType V boolTy
 < search.

Subgoal 2.31.1.2:

Variables: FT ET FE EE EE' O V E1 Ty1 V1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", V1)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType V1 boolTy
L : "null" = "null" -> false
L1 : lookup [] "null" V
============================
 valueType V boolTy
 < apply L to _.

Subgoal 2.31.2:

Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
Ev2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" V
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType NV boolTy
VT1 : valueType HV Ty1
VT2 : valueType TV (listTy Ty1)
============================
 valueType V boolTy
 < L: case Ev2.

Subgoal 2.31.2.1:

Variables: FT ET FE EE EE' O V E1 Ty1 TV HV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", V), ("head", HV), ("tail", TV)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType V boolTy
VT1 : valueType HV Ty1
VT2 : valueType TV (listTy Ty1)
============================
 valueType V boolTy
 < search.

Subgoal 2.31.2.2:

Variables: FT ET FE EE EE' O V E1 Ty1 TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 (recVal [("null", NV), ("head", HV), ("tail", TV)]) EE' O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
VT : valueType NV boolTy
VT1 : valueType HV Ty1
VT2 : valueType TV (listTy Ty1)
L : "null" = "null" -> false
L1 : lookup [("head", HV), ("tail", TV)] "null" V
============================
 valueType V boolTy
 < apply L to _.

Subgoal 2.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (index L I)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (index L I) Ty
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 valueType V Ty
 < case IsE.

Subgoal 2.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (index L I) Ty
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 valueType V Ty
 < Ty: case Ty.

Subgoal 2.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ty : typeOf FT ET L (listTy Ty)
Ty1 : typeOf FT ET I intTy
============================
 valueType V Ty
 < apply IH_T_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 2.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ty : typeOf FT ET L (listTy Ty)
Ty1 : typeOf FT ET I intTy
H3 : valueType LV (listTy Ty)
============================
 valueType V Ty
 < apply listIndex_typePres to _ Ev3.

Subgoal 2.32:

Variables: FT ET Ty FE EE EE' O V LV EE3 O2 Idx O3 I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Ty : typeOf FT ET L (listTy Ty)
Ty1 : typeOf FT ET I intTy
H3 : valueType LV (listTy Ty)
H4 : valueType V Ty
============================
 valueType V Ty
 < search.

Subgoal 2.33:

Variables: FT ET Ty FE EE EE' O V1 I E1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (exactEval:list:length E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : typeOf FT ET (exactEval:list:length E1) Ty
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
============================
 valueType (intVal I) Ty
 < case Ty.

Subgoal 2.33:

Variables: FT ET FE EE EE' O V1 I E1 Ty1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsE : is_expr (exactEval:list:length E1)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : typeOf FT ET E1 (listTy Ty1)
============================
 valueType (intVal I) intTy
 < search.

Subgoal 3.15:

Variables: FT ET ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsS : is_stmt (listUpdate L I E)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ET (listUpdate L I E) ET'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
============================
 related_all_scopes ET' EE'
 < case IsS.

Subgoal 3.15:

Variables: FT ET ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ET (listUpdate L I E) ET'
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 related_all_scopes ET' EE'
 < Ty: case Ty.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
============================
 related_all_scopes ET' EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
H4 : related_all_scopes ET' EE2
============================
 related_all_scopes ET' EE'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
H4 : related_all_scopes ET' EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 related_all_scopes ET' EE'
 < Ctxs': apply IH_C_E to _ _ _ _ _ _ Ev2 _ _.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
H4 : related_all_scopes ET' EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : related_all_scopes ET' EE4
============================
 related_all_scopes ET' EE'
 < apply IH_T_E to _ _ _ _ _ _ Ev2 _ _.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
H4 : related_all_scopes ET' EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : related_all_scopes ET' EE4
H6 : valueType V Ty
============================
 related_all_scopes ET' EE'
 < apply evalExpr_isCtx to _ _ _ Ev2.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
H4 : related_all_scopes ET' EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : related_all_scopes ET' EE4
H6 : valueType V Ty
H7 : is_list (is_list (is_pair is_string is_value)) EE4
============================
 related_all_scopes ET' EE'
 < apply related_all_scopes_lookupScopes to Ctxs' Ty Ev3.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
H4 : related_all_scopes ET' EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : related_all_scopes ET' EE4
H6 : valueType V Ty
H7 : is_list (is_list (is_pair is_string is_value)) EE4
H8 : valueType LV (listTy Ty)
============================
 related_all_scopes ET' EE'
 < apply updateListIndex_typePres to _ _ Ev4.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
H4 : related_all_scopes ET' EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : related_all_scopes ET' EE4
H6 : valueType V Ty
H7 : is_list (is_list (is_pair is_string is_value)) EE4
H8 : valueType LV (listTy Ty)
H9 : valueType LV2 (listTy Ty)
============================
 related_all_scopes ET' EE'
 < apply related_all_scopes_replaceScopes to _ _ _ Ev5 _ _.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L Ty
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
Ty : lookupScopes L ET' (listTy Ty)
Ty1 : typeOf FT ET' I intTy
Ty2 : typeOf FT ET' E Ty
H4 : related_all_scopes ET' EE2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
Ctxs' : related_all_scopes ET' EE4
H6 : valueType V Ty
H7 : is_list (is_list (is_pair is_string is_value)) EE4
H8 : valueType LV (listTy Ty)
H9 : valueType LV2 (listTy Ty)
H10 : related_all_scopes ET' EE'
============================
 related_all_scopes ET' EE'
 < search.

Subgoal 3.16:

Variables: FT ET ET' FE EE EE' O LV EE3 O2 O3 Body L X
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsS : is_stmt (listForeach X L Body)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ET (listForeach X L Body) ET'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 related_all_scopes ET' EE'
 < case IsS.

Subgoal 3.16:

Variables: FT ET ET' FE EE EE' O LV EE3 O2 O3 Body L X
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ET (listForeach X L Body) ET'
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 related_all_scopes ET' EE'
 < Ty: case Ty.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty TC1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body TC1
============================
 related_all_scopes ET' EE'
 < apply IH_C_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty TC1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body TC1
H4 : related_all_scopes ET' EE3
============================
 related_all_scopes ET' EE'
 < IsLTy: apply typeOf_isTy to _ _ _ Ty.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty TC1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body TC1
H4 : related_all_scopes ET' EE3
IsLTy : is_typ (listTy Ty)
============================
 related_all_scopes ET' EE'
 < case IsLTy.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty TC1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body TC1
H4 : related_all_scopes ET' EE3
H5 : is_typ Ty
============================
 related_all_scopes ET' EE'
 < apply stmtOK_older_scopes_same to _ _ _ Ty1.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET')
H4 : related_all_scopes ET' EE3
H5 : is_typ Ty
============================
 related_all_scopes ET' EE'
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET')
H4 : related_all_scopes ET' EE3
H5 : is_typ Ty
H6 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 related_all_scopes ET' EE'
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET')
H4 : related_all_scopes ET' EE3
H5 : is_typ Ty
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : is_value LV
============================
 related_all_scopes ET' EE'
 < apply IH_T_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET')
H4 : related_all_scopes ET' EE3
H5 : is_typ Ty
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : is_value LV
H8 : valueType LV (listTy Ty)
============================
 related_all_scopes ET' EE'
 < apply IH_IL to _ _ _ _ _ _ _ Ty1 _ _ Ev2 _ _.

Subgoal 3.16:

Variables: FT ET' FE EE EE' O LV EE3 O2 O3 Body L X Ty Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
Ty : typeOf FT ET' L (listTy Ty)
Ty1 : stmtOK FT ([(X, Ty)]::ET') Body (Scope'::ET')
H4 : related_all_scopes ET' EE3
H5 : is_typ Ty
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : is_value LV
H8 : valueType LV (listTy Ty)
H9 : related_all_scopes ET' EE'
============================
 related_all_scopes ET' EE'
 < search.

Subgoal 8.1:

Variables: X Body FT ET Ty Sc ET' FE EE' Fields
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET')
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE' (recVal Fields) X Body EE' [] @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE'
IL1 : lookup Fields "null" trueVal
============================
 related_all_scopes ET' EE'
 < apply stmtOK_older_scopes_same to _ _ _ Ty.

Subgoal 8.1:

Variables: X Body FT ET Ty FE EE' Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE' (recVal Fields) X Body EE' [] @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE'
IL1 : lookup Fields "null" trueVal
============================
 related_all_scopes ET EE'
 < search.

Subgoal 8.2:

Variables: X Body FT ET Ty Sc ET' FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET')
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
============================
 related_all_scopes ET' EE'
 < apply stmtOK_older_scopes_same to _ _ _ Ty.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
============================
 related_all_scopes ET EE'
 < case IsV.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 related_all_scopes ET EE'
 < apply lookup_is_value to _ IL2.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 related_all_scopes ET EE'
 < apply lookup_is_value to _ IL4.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 related_all_scopes ET EE'
 < And: assert valueType Hd Ty /\
   valueType Tl (listTy Ty).

Subgoal 8.2.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 valueType Hd Ty /\ valueType Tl (listTy Ty)
 < VTy: case VTy.

Subgoal 8.2.1.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' V1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", V1)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", V1)] "null" falseVal
IL2 : lookup [("null", V1)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup [("null", V1)] "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", V1)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType V1 boolTy
============================
 valueType Hd Ty /\ valueType Tl (listTy Ty)
 < L: case IL4.

Subgoal 8.2.1.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' V1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", V1)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", V1)] "null" falseVal
IL2 : lookup [("null", V1)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", V1)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType V1 boolTy
L : "null" = "tail" -> false
L1 : lookup [] "tail" Tl
============================
 valueType Hd Ty /\ valueType Tl (listTy Ty)
 < case L1.

Subgoal 8.2.1.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType TV (listTy Ty)
============================
 valueType Hd Ty /\ valueType Tl (listTy Ty)
 < split.

Subgoal 8.2.1.2.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType TV (listTy Ty)
============================
 valueType Hd Ty
 < LH: case IL2.

Subgoal 8.2.1.2.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType TV (listTy Ty)
LH : "null" = "head" -> false
LH1 : lookup [("head", HV), ("tail", TV)] "head" Hd
============================
 valueType Hd Ty
 < LH: case LH1.

Subgoal 8.2.1.2.1.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", Hd), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", Hd), ("tail", TV)] "null" falseVal
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup [("null", NV), ("head", Hd), ("tail", TV)] "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", Hd), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType Hd Ty
VTy2 : valueType TV (listTy Ty)
LH : "null" = "head" -> false
============================
 valueType Hd Ty
 < search.

Subgoal 8.2.1.2.1.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType TV (listTy Ty)
LH : "null" = "head" -> false
LH1 : "head" = "head" -> false
LH2 : lookup [("tail", TV)] "head" Hd
============================
 valueType Hd Ty
 < apply LH1 to _.

Subgoal 8.2.1.2.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup [("null", NV), ("head", HV), ("tail", TV)] "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType TV (listTy Ty)
============================
 valueType Tl (listTy Ty)
 < LT: case IL4.

Subgoal 8.2.1.2.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType TV (listTy Ty)
LT : "null" = "tail" -> false
LT1 : lookup [("head", HV), ("tail", TV)] "tail" Tl
============================
 valueType Tl (listTy Ty)
 < LT: case LT1.

Subgoal 8.2.1.2.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType TV (listTy Ty)
LT : "null" = "tail" -> false
LT1 : "head" = "tail" -> false
LT2 : lookup [("tail", TV)] "tail" Tl
============================
 valueType Tl (listTy Ty)
 < LT: case LT2.

Subgoal 8.2.1.2.2.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", Tl)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", Tl)] "null" falseVal
IL2 : lookup [("null", NV), ("head", HV), ("tail", Tl)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", Tl)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType Tl (listTy Ty)
LT : "null" = "tail" -> false
LT1 : "head" = "tail" -> false
============================
 valueType Tl (listTy Ty)
 < search.

Subgoal 8.2.1.2.2.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Scope' TV HV NV
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal [("null", NV), ("head", HV), ("tail", TV)]) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup [("null", NV), ("head", HV), ("tail", TV)] "null" falseVal
IL2 : lookup [("null", NV), ("head", HV), ("tail", TV)] "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) [("null", NV), ("head", HV), ("tail", TV)]
H2 : is_value Hd
H3 : is_value Tl
VTy : valueType NV boolTy
VTy1 : valueType HV Ty
VTy2 : valueType TV (listTy Ty)
LT : "null" = "tail" -> false
LT1 : "head" = "tail" -> false
LT2 : "tail" = "tail" -> false
LT3 : lookup [] "tail" Tl
============================
 valueType Tl (listTy Ty)
 < case LT3.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
And : valueType Hd Ty /\ valueType Tl (listTy Ty)
============================
 related_all_scopes ET EE'
 < case And.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
============================
 related_all_scopes ET EE'
 < assert related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE).

Subgoal 8.2.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
============================
 related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
 < unfold .

Subgoal 8.2.2.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
============================
 forall X1 T,
   lookup [(X, Ty)] X1 T -> exists V, lookup [(X, Hd)] X1 V /\ valueType V T
 < intros L.

Subgoal 8.2.2.1:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1 T
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
L : lookup [(X, Ty)] X1 T
============================
 exists V, lookup [(X, Hd)] X1 V /\ valueType V T
 < L: case L.

Subgoal 8.2.2.1.1:

Variables: Body FT ET FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1 T
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X1
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X1, T)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy T)
IsTy : is_typ T
IL : iterateList FE EE (recVal Fields) X1 Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X1, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X1 Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd T
H5 : valueType Tl (listTy T)
============================
 exists V, lookup [(X1, Hd)] X1 V /\ valueType V T
 < search.

Subgoal 8.2.2.1.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1 T
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
L : X = X1 -> false
L1 : lookup [] X1 T
============================
 exists V, lookup [(X, Hd)] X1 V /\ valueType V T
 < case L1.

Subgoal 8.2.2.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
============================
 forall X1, no_lookup [(X, Ty)] X1 -> no_lookup [(X, Hd)] X1
 < intros NL.

Subgoal 8.2.2.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
NL : no_lookup [(X, Ty)] X1
============================
 no_lookup [(X, Hd)] X1
 < case NL.

Subgoal 8.2.2.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope' X1
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
H6 : X = X1 -> false
H7 : no_lookup [] X1
============================
 no_lookup [(X, Hd)] X1
 < search.

Subgoal 8.2.2.3:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
============================
 related_all_scopes ET EE
 < search.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
============================
 related_all_scopes ET EE'
 < Ctxs': apply IH_C_S to _ _ _ _ _ Ty IL3 _ _.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
Ctxs' : related_all_scopes (Scope'::ET) (Scope::EE3)
============================
 related_all_scopes ET EE'
 < case Ctxs'.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
H7 : forall X T,
       lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H8 : forall X, no_lookup Scope' X -> no_lookup Scope X
H9 : related_all_scopes ET EE3
============================
 related_all_scopes ET EE'
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL3.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
H7 : forall X T,
       lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H8 : forall X, no_lookup Scope' X -> no_lookup Scope X
H9 : related_all_scopes ET EE3
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 related_all_scopes ET EE'
 < case IsEE3+.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
H7 : forall X T,
       lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H8 : forall X, no_lookup Scope' X -> no_lookup Scope X
H9 : related_all_scopes ET EE3
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 related_all_scopes ET EE'
 < apply IH_IL to _ _ _ _ _ _ _ Ty _ _ IL5 _ _.

Subgoal 8.2:

Variables: X Body FT ET Ty FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields Scope'
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IH_IL : forall V X Body FT ET Ty Sc ET' FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ([(X, Ty)]::ET) Body (Sc::ET') ->
          valueType V (listTy Ty) -> is_typ Ty -> iterateList FE EE V X Body EE' O * ->
          (forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
            exists Scope TyEnv',
              (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
              stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv') -> related_all_scopes ET EE ->
          related_all_scopes ET' EE'
IsX : is_string X
IsBody : is_stmt Body
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ([(X, Ty)]::ET) Body (Scope'::ET)
VTy : valueType (recVal Fields) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (recVal Fields) X Body EE' O @
Funs : forall F RetTy ArgTys ArgNames Body1 RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body1))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body1 TyEnv'
Ctxs : related_all_scopes ET EE
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : valueType Hd Ty
H5 : valueType Tl (listTy Ty)
H6 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
H7 : forall X T,
       lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H8 : forall X, no_lookup Scope' X -> no_lookup Scope X
H9 : related_all_scopes ET EE3
H10 : is_list (is_pair is_string is_value) Scope
H11 : is_list (is_list (is_pair is_string is_value)) EE3
H12 : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Proof completed.
 < Prove exactEval:host:paramTy_paramName_same.

Proof completed.
 < Prove exactEval:host:funOK_getFunEvalInfo_related.

Proof completed.
 < Prove exactEval:host:evalExpr_output_forms,
         exactEval:host:evalStmt_output_forms,
         exactEval:host:evalArgs_output_forms,
         exactEval:host:evalRecFields_output_forms
   with
      iterateList_output_forms : forall V X Body FE EE EE' O,
         IsV : is_value V ->
         IsX : is_string X ->
         IsBody : is_stmt Body ->
         IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         IsEE : is_list (is_list (is_pair is_string is_value)) EE ->
         IL : iterateList FE EE V X Body EE' O ->
         output_forms O
      on IL as IH_IL.

Subgoal 1.27:

Variables: FE EE' Ty
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsE : is_expr (nil Ty)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
Ev : evalExpr FE EE' (nil Ty) (recVal [("null", trueVal)]) EE' [] @
============================
 output_forms []
 < search.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsE : is_expr (cons E1 E2)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 output_forms O
 < case IsE.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
 output_forms O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 output_forms O
 < apply IH_E to _ _ _ Ev2.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ Ev3.

Subgoal 1.28:

Variables: FE EE EE' O EE3 O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (cons E1 E2) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE3 O2 *
Ev2 : evalExpr FE EE3 E2 V2 EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : output_forms O3
H6 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.29:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsE : is_expr (head E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
============================
 output_forms O
 < case IsE.

Subgoal 1.29:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.29:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (head E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "head" V
H1 : is_expr E1
H2 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.30:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsE : is_expr (tail E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
============================
 output_forms O
 < case IsE.

Subgoal 1.30:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.30:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (tail E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "tail" V
H1 : is_expr E1
H2 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.31:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsE : is_expr (null E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
============================
 output_forms O
 < case IsE.

Subgoal 1.31:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.31:

Variables: FE EE V EE' O Fields E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (null E1) V EE' O @
Ev1 : evalExpr FE EE E1 (recVal Fields) EE' O *
Ev2 : lookup Fields "null" V
H1 : is_expr E1
H2 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsE : is_expr (index L I)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 output_forms O
 < case IsE.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : output_forms O2
============================
 output_forms O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : output_forms O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 output_forms O
 < apply IH_E to _ _ _ Ev2.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : output_forms O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ Ev4.

Subgoal 1.32:

Variables: FE EE V EE' O LV EE3 O2 Idx O3 I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (index L I) V EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : evalExpr FE EE3 I (intVal Idx) EE' O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : output_forms O2
H4 : is_list (is_list (is_pair is_string is_value)) EE3
H5 : output_forms O3
H6 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsE : is_expr (exactEval:list:length E1)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
============================
 output_forms O
 < case IsE.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.33:

Variables: FE EE EE' O V1 I E1
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalExpr FE EE (exactEval:list:length E1) (intVal I) EE' O @
Ev1 : evalExpr FE EE E1 V1 EE' O *
Ev2 : listLength V1 I
H1 : is_expr E1
H2 : output_forms O
============================
 output_forms O
 < search.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsS : is_stmt (listUpdate L I E)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
============================
 output_forms O
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : output_forms O2
============================
 output_forms O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : output_forms O2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 output_forms O
 < apply IH_E to _ _ _ Ev2.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : output_forms O2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
H6 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ Ev6.

Subgoal 2.15:

Variables: FE EE EE' O N EE2 O2 V EE4 O3 LV LV2 E I L
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listUpdate L I E) EE' O @
Ev1 : evalExpr FE EE I (intVal N) EE2 O2 *
Ev2 : evalExpr FE EE2 E V EE4 O3 *
Ev3 : lookupScopes L EE4 LV
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE4 EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : output_forms O2
H5 : is_list (is_list (is_pair is_string is_value)) EE2
H6 : output_forms O3
H7 : output_forms O
============================
 output_forms O
 < search.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsS : is_stmt (listForeach X L Body)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 output_forms O
 < case IsS.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : output_forms O2
============================
 output_forms O
 < apply evalExpr_isCtx to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : output_forms O2
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 output_forms O
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : output_forms O2
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_value LV
============================
 output_forms O
 < apply IH_IL to _ _ _ _ _ Ev2.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : output_forms O2
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_value LV
H7 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ Ev3.

Subgoal 2.16:

Variables: FE EE EE' O LV EE3 O2 O3 Body L X
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (listForeach X L Body) EE' O @
Ev1 : evalExpr FE EE L LV EE3 O2 *
Ev2 : iterateList FE EE3 LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : output_forms O2
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_value LV
H7 : output_forms O3
H8 : output_forms O
============================
 output_forms O
 < search.

Subgoal 5.1:

Variables: X Body FE EE' Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE'
IL : iterateList FE EE' (recVal Fields) X Body EE' [] @
IL1 : lookup Fields "null" trueVal
============================
 output_forms []
 < search.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsV : is_value (recVal Fields)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
============================
 output_forms O
 < case IsV.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
============================
 output_forms O
 < apply lookup_is_value to _ IL2.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
============================
 output_forms O
 < apply lookup_is_value to _ IL4.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
============================
 output_forms O
 < apply IH_S to _ _ _ IL3.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : output_forms O2
============================
 output_forms O
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL3.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : output_forms O2
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 output_forms O
 < case IsEE3+.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : output_forms O2
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 output_forms O
 < apply IH_IL to _ _ _ _ _ IL5.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : output_forms O2
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ IL6.

Subgoal 5.2:

Variables: X Body FE EE EE' O Hd Scope EE3 O2 Tl O3 Fields
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IH_IL : forall V X Body FE EE EE' O,
          is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * ->
          output_forms O
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IL : iterateList FE EE (recVal Fields) X Body EE' O @
IL1 : lookup Fields "null" falseVal
IL2 : lookup Fields "head" Hd
IL3 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL4 : lookup Fields "tail" Tl
IL5 : iterateList FE EE3 Tl X Body EE' O3 *
IL6 : O2 ++ O3 = O
H1 : is_list (is_pair is_string is_value) Fields
H2 : is_value Hd
H3 : is_value Tl
H4 : output_forms O2
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) EE3
H7 : output_forms O3
H8 : output_forms O
============================
 output_forms O
 < search.

Proof completed.
 < Prove exactEval:host:evalProgram_output_forms.

Proof completed.
 < Prove exactEval:host:paramName_exists.

Proof completed.
 < Prove exactEval:host:getFunEvalInfo_exists.

Proof completed.
Back to example home